bitbake do_rootfs 安装失败,bbappend 中有共享库符号链接

bitbake do_rootfs install fails with shared library symlink in bbappend

我正在尝试从依赖于 libudev.so.0openembedded-core 层的 eudev recipe 仅提供 libudev.so.1.6.3 和一个 libudev.so.1 符号链接: libudev.so.1 -> libudev.so.1.6.3

我添加了一个 eudev_%.bbappend recipes_core 创建符号链接的方法

do_install_append() {
        ln -srf ${D}${base_libdir}/libudev.so.1 ${D}${base_libdir}/libudev.so.0
}

我可以确认 libudev.so.0 文件已添加到

中的 libudev 包中
tmp/work/HOST/eudev/3.1.5-r0/image/lib/libudev.so.0 
tmp/work/HOST/eudev/3.1.5-r0/package/lib/libudev.so.0 
tmp/work/HOST/eudev/3.1.5-r0/packages-split/lib/libudev.so.0 
tmp/work/HOST/eudev/3.1.5-r0/sysroot-destdir/lib/libudev.so.0

并在构建映像时安装到映像的 tmp/sysroots/MACHINE/lib/libudev.so.0 目录,并存在于生成的 tmp/deploy/images/MACHINE/IMAGENAME.tar.bz2 rootfs 存档中。问题是,在上述情况下,我无法将我的共享库包添加到图像中,因为它会导致以下错误:

do_rootfs: ...
Computing transaction...error: Can't install MYRECIPE@HOST: no package provides libudev.so.0

自定义配方确实有 RDEPENDS_${PN} = libudev 设置。

为什么会出现 do_rootfs 错误,因为安装的 libudev 包显然提供了 libudev.so.0 库?独立对自定义配方进行 Bitbaking 没有问题,但这显然不会尝试将结果包安装到图像中。

Why is the do_rootfs error generated as the installed libudev package clearly does provide the libudev.so.0 library?

我很确定相关的代码不是在查看文件名,而是在查看您的库所需的实际符号——打包魔术会查看所有库和可执行文件,并根据他们需要的符号(这就是正确的依赖库最终出现在 rootfs 上的方式)。我相信错误消息试图说明没有可用的库导出您的库需要的符号。

您可以使用

检查您的 udev 导出的 soname
readelf -a libudev.so.1 | grep SONAME
0x000000000000000e (SONAME)             Library soname: [libudev.so.1]

我尚未确认这是 rootfs 代码检查的内容,但很有可能。

您是否希望与 libudev.so.0 链接的库仅与 libudev.so.1 一起工作而无需重新编译?我不熟悉 udev,但一般图书馆不太可能那样工作。

The custom recipe does have RDEPENDS_${PN} = libudev set.

这通常不需要——如果您的软件动态链接到库,运行时依赖项会自动找到。