Smart无法安装......没有包提供共享对象文件

时间:2016-04-18 20:35:14

标签: java rpm yocto bitbake openembedded

问题

我试图创建一个Bitbake配方,它将Oracle JRE 8安装到我的目标操作系统上。

我尝试使用meta-oracle-java中的元数据,但由于为一般JRE提供的.inc文件之一具有特定于JRE-7的URI,因此遇到了一些困难。

我已经从meta-oracle-java中更改了一些元数据并创建了我自己的配方来进行此安装。

测试

自己构建JRE食谱

单独构建配方时:

bitbake oracle-jse-jre

构建完成且没有错误。我已将libav添加到oracle-jse-jre食谱中,因此我可以从TMPDIR执行以下操作:

$ find . -name libavformat*so 
./work/core2-64-poky-linux/libav/9.18-r0/sysroot-destdir/usr/lib/libavformat.so.54.20.4
./work/core2-64-poky-linux/libav/9.18-r0/sysroot-destdir/usr/lib/libavformat.so
./work/core2-64-poky-linux/libav/9.18-r0/sysroot-destdir/usr/lib/libavformat.so.54
./sysroots/genericx86-64/usr/lib/libavformat.so.54.20.4
./sysroots/genericx86-64/usr/lib/libavformat.so
./sysroots/genericx86-64/usr/lib/libavformat.so.54

运行时依赖成功

如果我将oracle-jse-jre食谱中的默认包添加到另一个食谱RDEPENDS_${PN}的{​​{1}},我可以运行xenoros_0.1.bb并构建没有错误。

核心图像失败

如果我将bitbake xenoros添加到xenoros的{​​{1}}变量,则构建将失败,并显示以下错误:

IMAGE_INSTALL

查看core-image-xenoros内部,我可以找到:

ERROR: Unable to install packages. Command '/home/presslertj/yocto-OS/poky-jethro-build/build/tmp/sysroots/x86_64-linux/usr/bin/smart --log-level=warning --data-dir=/home/presslertj/yocto-OS/poky-jethro-build/build/tmp/work/genericx86_64-poky-linux/core-image-my-server/1.0-r0/rootfs/var/lib/smart install -y message-generation@core2_64 catkin@core2_64 python-distutils@core2_64 ldd@core2_64 xenoros@core2_64 rosgraph@core2_64 gedit@core2_64 actionlib@core2_64 python-compression@core2_64 dhcp-server@core2_64 libpthread-stubs@core2_64 tf2@core2_64 python-email@core2_64 catkin-dev@core2_64 git@core2_64 rosbash@core2_64 python-json@core2_64 python-wstool@core2_64 connman@core2_64 ros-config@core2_64 packagegroup-core-boot@genericx86_64 libsdl-1.2-0@core2_64 rosjava@core2_64 quagga@core2_64 nginx@core2_64 rospy@core2_64 apt@core2_64 libc6@core2_64 netcat@core2_64 shadow@core2_64 bash@core2_64 roscpp@core2_64 roslaunch@core2_64 run-postinsts@all python-rosinstall@core2_64 elfutils@core2_64 openssl@core2_64 font-alias@all gradle@core2_64 python-catkin-pkg@core2_64 catkin-runtime@core2_64 catkin-runtime-dev@core2_64 pciutils@core2_64 base-passwd@core2_64' returned 1:
Loading cache...
Updating cache...               ######################################## [100%]

Computing transaction...error: Can't install oracle-jse-jre-1.8.0-u77r0@core2_64: no package provides libavformat.so.53(LIBAVFORMAT_53)(64bit)

ERROR: Function failed: do_rootfs
ERROR: Logfile of failure stored in: /home/presslertj/yocto-OS/poky-jethro-build/build/tmip/work/genericx86_64-poky-linux/core-image-my-server/1.0-r0/temp/log.do_rootfs.22073
ERROR: Task 7 (/home/presslertj/yocto-OS/poky-jethro-build/meta-myLayer/recipes-core/images/core-image-my-server.bb, do_rootfs) failed with exit code '1'

似乎版本不匹配,smart期望版本53,但提供了54。

还原TMPDIR的版本

为了测试发生了什么,我已经制作了一个获取/sysroots/genericx86-64/usr/lib/libavformat.so.54 版本libav(使用版本53)的配方。当使用此代替0.8.17时,我遇到了完全相反的问题,即智能预期,但无法找到版本54.

问题

  1. 智能如何确定这些共享对象文件的版本号?
  2. do_rootfs()任务会导致构建在此特定时间失败吗?
  3. 我的具体问题是否有简单的解决方案?

2 个答案:

答案 0 :(得分:1)

1)它不聪明,而是rpmbuild,即添加从ELF DT_NEEDED字段派生的依赖项(参见elfutils -a)。

2)由于未解决的依赖关系,do_rootfs()任务失败。

3)由于您使用的是Poky / Yocto和rpm5,因此可以通过一种简单的方法来掩盖问题(替换任何导致您胃灼热的依赖关系)

echo "unresoved_dependency" > /etc/rpm/sysinfo/Providename

这只是一个创可贴;你仍然需要弄清楚包装问题,而不是掩盖你构建rpm包的基本问题。

答案 1 :(得分:0)

对于仍然遇到此错误的任何人:如meta-oracle-java repo的README文件中所述

import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import org.example.service.dto.MyDto;
import org.wso2.msf4j.Request;

    @Path("/hello/1.[\\d]/version")
    public class HelloService {

        @GET
        @Path("/{version}")
        @Produces({"application/json"})
        public Response hello(@PathParam("version") int version, @Context Request request) {
            MyDto dtoObject = new MyDto(1, "TestObjName", "TestObjAddress");
            if (version < 1) {
                //return object without address
            } else {
                //return object with address
            }
        }
    }