Bitbake编译C项目后依赖库未加入镜像RootFS的问题排查与解决
问题描述
将基于Yocto构建的hello.bin部署到Orange-Pi-R1设备后,运行时出现依赖库缺失错误:
admin@orange-pi-r1:~# /var/hello.bin Error loading shared library libmicrohttpd.so.12: No such file or directory (needed by /var/hello.bin) Error loading shared library libjson-c.so.5: No such file or directory (needed by /var/hello.bin) Error relocating /var/hello.bin: json_object_new_string: symbol not found Error relocating /var/hello.bin: MHD_destroy_response: symbol not found Error relocating /var/hello.bin: json_object_object_add: symbol not found Error relocating /var/hello.bin: MHD_create_response_from_buffer: symbol not found Error relocating /var/hello.bin: MHD_queue_response: symbol not found Error relocating /var/hello.bin: MHD_start_daemon: symbol not found Error relocating /var/hello.bin: json_object_new_array: symbol not found Error relocating /var/hello.bin: MHD_add_response_header: symbol not found Error relocating /var/hello.bin: json_object_put: symbol not found Error relocating /var/hello.bin: json_object_to_json_string: symbol not found Error relocating /var/hello.bin: MHD_stop_daemon: symbol not found Error relocating /var/hello.bin: json_object_new_object: symbol not found Error relocating /var/hello.bin: json_object_array_add: symbol not found Error relocating /var/hello.bin: json_object_new_int: symbol not found
对应的hello.bb配方:
SUMMARY = "hello" LICENSE = "CLOSED" SRCBRANCH = "hello" SRCREV = "03b9c21ef46973d2a285db785a04620ebaf25db2" SRC_URI = "git://git@bitbucket.org/hello/hello.git;branch=${SRCBRANCH};protocol=ssh" S = "${WORKDIR}/git" DEPENDS = "sqlite3 libmicrohttpd json-c" INSANE_SKIP:${PN} += "ldflags" do_compile() { cd ${S}/src && oe_runmake } do_install() { install -d ${D}/var/ install -m 0644 ${S}/src/hello.bin ${D}/var/hello.bin } FILES:${PN} = "/var/hello.bin"
项目Makefile:
CC ?= gcc CFLAGS += -O2 CFLAGS += -I./include CFLAGS += -I${STAGING_INCDIR}/usr/lib LDLIBS += -lmicrohttpd -lsqlite3 -ljson-c LDFLAGS += -L${STAGING_LIBDIR}/usr/lib cc-headers = \ hello.h \ hello_db.h \ hello_http.h \ hello_list.h cc-targets = \ hello.o \ hello_db.o \ hello_http.o %.o: %.c $(cc-headers) $(CC) -c -o $@ $< $(CFLAGS) all: $(cc-targets) $(CC) -o helo.bin $(CFLAGS) $(LDLIBS) $(cc-targets) clean: rm *.o
问题原因
- 运行时依赖未声明:
DEPENDS仅告知Yocto编译阶段需要这些库,但不会自动将共享库打包到目标镜像。必须通过RDEPENDS声明运行时依赖,否则构建的RootFS不会包含这些库文件。 - Makefile路径配置错误:
CFLAGS中引用的${STAGING_INCDIR}/usr/lib是库文件路径,不是头文件路径;LDFLAGS中的${STAGING_LIBDIR}/usr/lib属于冗余配置,Yocto的构建环境已自动配置正确的头文件和库路径,手动添加错误路径会导致链接逻辑异常。 - 编译产物文件名不匹配:Makefile编译输出为
helo.bin(拼写错误),但配方中安装的是hello.bin,存在编译与安装的产物不匹配问题。 - 屏蔽了链接标志检查:
INSANE_SKIP:${PN} += "ldflags"跳过了Yocto对链接参数的合法性检查,掩盖了路径配置错误的问题。
解决步骤
1. 修复hello.bb配方,添加运行时依赖
在配方中补充RDEPENDS,确保目标镜像包含所需的共享库:
DEPENDS = "sqlite3 libmicrohttpd json-c" # 新增运行时依赖声明 RDEPENDS:${PN} = "sqlite3 libmicrohttpd json-c"
2. 修正Makefile中的路径错误
删除错误的路径配置,依赖Yocto构建环境的默认配置:
# 移除错误的头文件路径配置 # CFLAGS += -I${STAGING_INCDIR}/usr/lib CFLAGS += -I./include # 移除错误的库路径配置 # LDFLAGS += -L${STAGING_LIBDIR}/usr/lib
注:Yocto的构建环境已自动为
CC和链接器配置了正确的头文件、库路径,手动添加额外路径容易引发冲突。
3. 修正Makefile的输出文件名
将编译输出改为hello.bin,与配方中的安装路径匹配:
all: $(cc-targets) $(CC) -o hello.bin $(CFLAGS) $(LDLIBS) $(cc-targets)
4. 移除不必要的INSANE_SKIP(可选)
修复链接路径问题后,建议删除INSANE_SKIP:${PN} += "ldflags",让Yocto执行正常的链接标志检查,避免隐藏后续问题。
5. 重新构建并部署
执行以下命令重新构建包或镜像:
# 单独构建hello包 bitbake hello # 或者重新构建整个目标镜像(替换为你的镜像名称) bitbake core-image-minimal
之后重新烧录镜像或通过scp将更新后的包部署到Orange-Pi-R1设备。
内容的提问来源于stack exchange,提问作者BlameCapitalism
相关产品推荐
相关产品推荐

