Yocto install 预编译库的问题解决。
解决方案:https://wiki.yoctoproject.org/wiki/TipsAndTricks/Packaging_Prebuilt_Libraries
错误:
Error: Problem: conflicting requests - nothing provides libxxx.so needed by xxx
ERROR: do_rootfs: Could not invoke dnf. Commandreturned 1:
Added oe-repo repo from /xxx/xxx/xxx/oe-rootfs-repo
Last metadata expiration check: 0:00:00 ago on Thu 10 Dec 2019 12:47:40 AM UTC.
Error:
Problem: conflicting requests
- nothing provides APP-A.so needed by App-B-1.0-r0.cortexa53hf_neon_fp_armv8
ERROR: do_rootfs: Function failed: do_rootfs
ERROR: Logfile of failure stored in: xxx/xxx/xxx/temp/log.do_rootfs.662
ERROR: Task do_rootfs failed with exit code '1'
背景(考虑下面的嵌入式应用场景):
1.你有两个应用程序,一个应用程序(我们叫它App-A)已经被你预编译成了库。且该App-A你并不是通过Yocto编译生成的。
因为App-A并不需要在系统启动后一直运行。只有在需要的时候,其他的App调用这个库才跑App-A。
所以,其他的App在某种程度上依赖于App-A的库文件。
2. App-B依赖于App-A.so,而你预编译库是有版本号的,例如App-A.so.0.1.2。
通过Yocto编译,可以install App-A.so.0.1.2。这没有问题。
但是,因为App-B依赖于App-A.so,所以你会想到在.bb file install App-A.so.0.1.2之后再创建一个软链接App-A.so--->App-A.so.0.1.2。
do_install() {
install -d ${D}${libdir}
install -m 0755 ${S}/App_A.so.0.1.2 ${D}${libdir}
ln -sf App_A.so.0.1.2 ${D}${libdir}/App_A.so.0
ln -sf App_A.so.0 ${D}${libdir}/App_A.so
}
这时候就会出上面的do_rootfs error。
因为Yocto对install 预编译库及库的版本存在一些规则(详见解决方案的介绍),所以很多人也遇到过类似问题。