Yocto项目链接共享库时出现library_common.h找不到错误
Yocto共享库头文件找不到问题排查与解决
问题背景
我在Yocto项目中开发一个共享库,目录结构如下:
library ├── svc │ ├── src │ │ └── library_common.c │ ├── inc │ │ └── library_common.h ├── Makefile.am ├── configure.ac └── library.pc.in
已配置的关键文件
Makefile.am:
ACLOCAL_AMFLAGS = -I m4 AM_CFLAGS = -Wundef \ -Wstrict-prototypes \ -fno-short-enums \ -fpic \ -Wall \ -Wunused AM_CPPFLAGS = -I$(srcdir)/svc/inc AM_LDFLAGS = $(TARGET_LDFLAGS) \ -g \ -fexceptions \ -fpie lib_LTLIBRARIES = liblibrary.la source_dir = svc/src header_dir = svc/inc source_files = $(source_dir)/library_common.c header_files = $(header_dir)/library_common.h required_libs = -lpthread -lrt pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = library.pc EXTRA_DIST = $(pkgconfig_DATA) liblibrary_la_SOURCES = $(source_files) $(header_files) liblibrary_la_CFLAGS = $(AM_CFLAGS) liblibrary_la_CPPFLAGS = $(AM_CPPFLAGS) liblibrary_la_LDFLAGS = $(AM_LDFLAGS) -shared -version-info 1:0:0 liblibrary_la_LIBADD = $(required_libs)
configure.ac:
AC_PREREQ(2.61) AC_INIT([library], 1.0.0) AC_CONFIG_AUX_DIR([build-aux]) AM_INIT_AUTOMAKE([foreign subdir-objects]) AM_MAINTAINER_MODE AC_CONFIG_SRCDIR([svc/src/library_common.c]) AC_CONFIG_HEADER([config.h]) AC_CONFIG_MACRO_DIR([m4]) AC_PROG_CC AC_PROG_LIBTOOL PKG_PROG_PKG_CONFIG LT_INIT() AC_CONFIG_FILES([Makefile \ library.pc]) AC_OUTPUT
library_git.bb:
inherit pkgconfig autotools-brokensep qprebuilt deploy DESCRIPTION = "library" HOMEPAGE = "http://support.cdmatech.com" LICENSE = "****" LIC_FILES_CHKSUM = "****" SRC_DIR = "${WORKSPACE}/data/library" FILESPATH =+ "${WORKSPACE}/data:" SRC_URI = "file://library/" S = "${WORKDIR}/library" # Package Revision (update whenever recipe is changed) PR = "r1"
问题现象
已将该库添加到目标软件包BitBake配方的DEPENDS变量,且在软件包的Makefile.am中设置了bin_CPPFLAGS = $(LIBRARY_CFLAGS)、bin_LDADD = $(MBOEM_LIBS),但执行bitbake package时出现头文件找不到的错误:
| in_some_file:75:10: fatal error: library_common.h: No such file or directory | 75 | #include "library_common.h"
解决方案
1. 确保共享库安装头文件
当前Makefile.am未指定头文件安装规则,导致头文件不会被同步到Yocto的sysroot中,依赖包无法找到。修改Makefile.am,添加头文件安装配置:
# 直接安装到系统默认include目录 include_HEADERS = $(header_files) # 若希望头文件安装到子目录(如include/library),改用以下配置: # librarydir = $(includedir)/library # library_HEADERS = $(header_files)
2. 完善library.pc.in内容
pkgconfig文件需要正确导出头文件路径和链接参数,确保依赖包能通过pkg-config获取正确的编译/链接参数。示例library.pc.in:
prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: library Description: 自定义共享库 Version: @VERSION@ Libs: -L${libdir} -llibrary @required_libs@ Cflags: -I${includedir} # 若头文件安装到子目录,Cflags改为:-I${includedir}/library
3. 修正依赖包的Makefile.am配置
确保依赖包正确通过pkg-config引入库的参数:
# 通过pkg-config获取编译和链接参数 LIBRARY_CFLAGS = $(shell pkg-config --cflags library) LIBRARY_LIBS = $(shell pkg-config --libs library) # 应用到目标程序 bin_PROGRAMS = your_program your_program_SOURCES = ... your_program_CPPFLAGS = $(LIBRARY_CFLAGS) your_program_LDADD = $(LIBRARY_LIBS)
4. 优化Yocto配方
- 移除不必要的
qprebuilt继承(除非确实需要预构建逻辑,否则会干扰autotools构建),修改配方的继承部分:inherit pkgconfig autotools deploy - 清理库的构建状态后重新构建:
bitbake -c cleansstate library bitbake library bitbake package
5. 验证头文件安装状态
构建完成后,检查sysroot中是否存在目标头文件:
# 替换为你的目标架构和构建目录路径 find ${BUILDDIR}/tmp/sysroots/your-arch/usr/include -name library_common.h
内容的提问来源于stack exchange,提问作者poor_developer
相关产品推荐
相关产品推荐

