执行populate_sdk时如何使用yocto在本机sysroot中安装文件?

时间:2019-08-20 15:16:14

标签: c++ cmake yocto

我正在使用Yocto(THUD)为imx6处理器构建自定义图像。使用该图像,我为QT应用程序创建了配方,并为使用cmake构建的c ++库创建了配方。

我正在考虑为该图像构建SDK。我希望SDK允许交叉编译,还希望编译QT应用程序,以便它可以在主机(SDKMACHINE)上运行。交叉编译部分的工作原理很像。这是构建QT应用程序以在我遇到麻烦的主机上运行的部分。

首先,这是该库的配方:

SRC_URI = "file://LibName"

inherit cmake

S = "${WORKDIR}"

FILES_${PN} += "${includedir}/*.h ${includedir}/"

BBCLASSEXTEND = "native nativesdk"

do_configure() {
    cmake  ../LibName/src
}

do_install() {
    install -d ${D}${libdir}
    install -m 0755 ${S}/build/libLibName.so ${D}${libdir}/libLibName.so.0
    ln -s libLibName.so.0 ${D}${libdir}/libLibName.so
    install -m 0755 ${S}/build/libLibName.a ${D}${libdir}

    install -d ${D}${includedir}/LibName/
    cp -r ${S}/LibName/includes ${D}${includedir}/LibName/
    install -d ${D}${includedir}/LibName/src
    rsync -a --include='*.h' --include='*/' --exclude='*' ${S}/LibName/src/ ${D}${includedir}/LibName/src
}

在我的图像配方文件中,我添加了:

TOOLCHAIN_HOST_TASK += "nativesdk-lib-name"

然后我使用以下方法构建SDK:

bitbake -c populate_sdk custom-iamge-recipe

我的问题是,生成的SDK没有本机sysroot中包含的包含文件。我期望我的本机sysroot(/opt/fslc-x11/2.6.2/sysroots/x86_64-fslcsdk-linux/usr/include)将包含c ++库包含文件,就像目标sysroot(/ opt / fslc-x11 / 2.6.2 / sysroots / armv7at2hf-neon-fslc-linux-gnueabi)。

我不了解的另一件事是本机sysroot包含库(libLibName.so.0),但不包含符号链接(libLibName.so)。我期望符号链接会像在目标sysroot中一样出现。

这是我现在拥有的:

/opt/fslc-x11/2.6.2/sysroots
├── armv7at2hf-neon-fslc-linux-gnueabi/usr
│   ├── include
│   │   └── LibName
│   │       └── include files
│   └── lib
│       ├── libLibName.so.0
│       └── libLibName.so 
└── x86_64-fslcsdk-linux/usr
    └── lib
        └── libLibName.so.0

这就是我想要的:

/opt/fslc-x11/2.6.2/sysroots
├── armv7at2hf-neon-fslc-linux-gnueabi/usr
│   ├── include
│   │   └── LibName
│   │       └── include files
│   └── lib
│       ├── libLibName.so.0
│       └── libLibName.so 
└── x86_64-fslcsdk-linux/usr
    ├── include
    │   └── LibName
    │       └── include files
    └── lib
        ├── libLibName.so.0
        └── libLibName.so 

在此先感谢您的帮助,不胜感激!

1 个答案:

答案 0 :(得分:1)

PACKAGES变量定义为here为:

PACKAGES = "${PN}-src ${PN}-dbg ${PN}-staticdev ${PN}-dev ${PN}-doc ${PN}-locale ${PACKAGE_BEFORE_PN} ${PN}"

因此,当Yocto从配方中打包文件时,它以PACKAGES的顺序包含它们,在这种情况下,头文件先包含在${PN}-dev中,然后才能包含在${PN}中:

FILES_${PN}-dev = "${includedir} ..."

要将标头添加到SDK中,您可以添加-dev软件包:

TOOLCHAIN_HOST_TASK += "nativesdk-lib-name nativesdk-lib-name-dev"

请注意,您还可以通过以下方式重新定义PACKAGES变量:

PACKAGES = "${PN}"

使您的电话线正常工作:FILES_${PN} += "${includedir}/*.h ${includedir}/"