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

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
问题原因
  1. 运行时依赖未声明:DEPENDS仅告知Yocto编译阶段需要这些库,但不会自动将共享库打包到目标镜像。必须通过RDEPENDS声明运行时依赖,否则构建的RootFS不会包含这些库文件。
  2. Makefile路径配置错误:CFLAGS中引用的${STAGING_INCDIR}/usr/lib是库文件路径,不是头文件路径;LDFLAGS中的${STAGING_LIBDIR}/usr/lib属于冗余配置,Yocto的构建环境已自动配置正确的头文件和库路径,手动添加错误路径会导致链接逻辑异常。
  3. 编译产物文件名不匹配:Makefile编译输出为helo.bin(拼写错误),但配方中安装的是hello.bin,存在编译与安装的产物不匹配问题。
  4. 屏蔽了链接标志检查: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:25:51