我正在尝试将共享库包添加到依赖于libudev.so.0
但 openembedded-core 层{{1}的自定义配方的Yocto Krogoth图像中}} recipe仅提供eudev
和libudev.so.1.6.3
符号链接:
libudev.so.1
我添加了libudev.so.1 -> libudev.so.1.6.3
recipes_core 配方,用于创建符号链接
eudev_%.bbappend
我可以确认do_install_append() {
ln -srf ${D}${base_libdir}/libudev.so.1 ${D}${base_libdir}/libudev.so.0
}
文件已添加到 libudev 包中
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
rootfs存档中。问题是,上面的内容我无法将我的共享库包添加到图像中,因为它会导致以下错误:
tmp/deploy/images/MACHINE/IMAGENAME.tar.bz2
自定义配方确实设置了do_rootfs: ...
Computing transaction...error: Can't install MYRECIPE@HOST: no package provides libudev.so.0
。
为什么生成 do_rootfs 错误,因为已安装的RDEPENDS_${PN} = libudev
包显然提供了libudev
库?独立地定制自定义配方没有问题,但显然不会尝试将结果包安装到图像中。
答案 0 :(得分:0)
为什么do_rootfs错误是作为已安装的libudev包生成的 显然提供了libudev.so.0库吗?
我非常确定相关代码不是在查看文件名,而是查看图书馆所需的实际符号 - 这些包装魔术可以查看所有库和可执行文件并找出数据他们的运行时依赖性基于他们需要的符号(这是正确的依赖库最终在rootfs上的结果)。我相信错误消息是试图说没有可用的库导出库所需的符号。
您可以使用
检查您的udev导出的sonamereadelf -a libudev.so.1 | grep SONAME
0x000000000000000e (SONAME) Library soname: [libudev.so.1]
我还没有确认这是rootfs代码检查的内容,但很有可能。
您是否期望与libudev.so.0链接的库只能使用libudev.so.1而不需要重新编译?我不熟悉udev,但一般来说,库不太可能像那样工作。
自定义配方确实有RDEPENDS _ $ {PN} = libudev set。
通常不需要这样做 - 如果您的软件动态链接到库,则会自动找到运行时依赖项。