You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:49:54