bitbake do_rootfs 安装失败,bbappend 中有共享库符号链接
bitbake do_rootfs install fails with shared library symlink in bbappend
我正在尝试从依赖于 libudev.so.0
但 openembedded-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.
这通常不需要——如果您的软件动态链接到库,运行时依赖项会自动找到。
我正在尝试从依赖于 libudev.so.0
但 openembedded-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
文件已添加到
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 导出的 sonamereadelf -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.
这通常不需要——如果您的软件动态链接到库,运行时依赖项会自动找到。