Yocto/OE:使用CMake安装共享库的配方。所以

Yocto/OE:使用CMake安装共享库的配方。所以,cmake,shared-libraries,yocto,Cmake,Shared Libraries,Yocto,我需要弄清楚如何管理基于CMake的软件包配方,创建一个非常简单的共享库。 目标是以原子方式将.so库提供给Yocto构建系统,以便其他管理应用程序级别的配方可以使用 这是简单的cpp代码 #include <iostream> #include "Student.h" using namespace std; Student::Student(string name):name(name){} void Student::display(){ cout <<

我需要弄清楚如何管理基于CMake的软件包配方,创建一个非常简单的共享库。 目标是以原子方式将.so库提供给Yocto构建系统,以便其他管理应用程序级别的配方可以使用

这是简单的cpp代码

#include <iostream>
#include "Student.h"
using namespace std;

Student::Student(string name):name(name){}

void Student::display(){
    cout << "A student with name " << this->name << endl;
}
这是配方studentlib_0.1.bb

SUMMARY = "Cmake application - creates a library"

SECTION = "examples"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = "\
            file://CMakeLists.txt \
            file://student.cpp \
            file://student.h \
        "

S = "${WORKDIR}"

inherit cmake

EXTRA_OECMAKE = ""
问题是当我构建特定的配方studentlib时

$ bitbake studentlib
...
Build Configuration:
BB_VERSION           = "1.38.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "universal"
TARGET_SYS           = "arm-poky-linux-gnueabi"
MACHINE              = "qemuarm"
DISTRO               = "poky"
DISTRO_VERSION       = "2.5.2"
TUNE_FEATURES        = "arm armv5 thumb dsp"
TARGET_FPU           = "soft"
    ...
NOTE: Executing RunQueue Tasks
ERROR: studentlib-0.1-r0 do_package_qa: QA Issue: -dev package contains non-symlink .so: studentlib-dev path '/work/armv5e-poky-linux-gnueabi/studentlib/0.1-r0/packages-split/studentlib-dev/usr/lib/libtestStudent.so' [dev-elf]
ERROR: studentlib-0.1-r0 do_package_qa: QA run found fatal errors. Please consider fixing them.
ERROR: studentlib-0.1-r0 do_package_qa: Function failed: do_package_qa
ERROR: Logfile of failure stored in: /home/me/yocto-qemuarm-sumo/poky/build/tmp/work/armv5e-poky-linux-gnueabi/studentlib/0.1-r0/temp/log.do_package_qa.21681
ERROR: Task (/home/me/yocto-qemuarm-sumo/poky/meta-me/recipes-cmake/studentlib/studentlib_0.1.bb:do_package_qa) failed with exit code '1'
我如何解决这个问题? 我找不到任何例子来解释

感谢

在Yocto中,当文件(在do_install中手动安装或在make、cmake、autotools等中安装在${D}中,例如在do_compile中)与文件\u foo中包含的正则表达式(或glob,对此不完全确定)匹配时,将其放入一个包中

一个配方可以(而且通常确实)提供多个包装。因此,您将有多个文件\u foo1与它们自己的路径匹配

在Yocto中,文件被放在第一个包中,其文件\u foo中的一个路径与该文件匹配。即使该文件与其他包的路径匹配,它也将永远只在一个包中,第一个包

FWIW,在配方中的packages变量中从最左边到最右边创建包。默认情况下,PACKAGES变量是${PN}-src${PN}-dbg${PN}-staticdev${PN}-dev${PN}-doc${PN}-locale${PACKAGE\u BEFORE\u PN}${PN}(c.f.)

默认文件_*变量也在bitbake.conf、c.f.中定义。查找从文件开始的所有内容

在这里,您可以看到默认情况下,文件${PN}打包了${libdir}/lib*${SOLIBS}(c.f.)。默认情况下,SOLIBS是.so.*(c.f.),这意味着${PN}包中只打包了点版本的库(如果它们之前没有被另一个包匹配)。另一方面,FILES_${PN}-dev将${FILES_SOLIBSDEV}打包为${base_libdir}/lib*${SOLIBSDEV}${libdir}/lib*${SOLIBSDEV},其中SOLIBSDEV依次默认为.so(c.f.,and)。请注意,库文件名应全部以lib开头,以便能够与默认文件匹配

TL;DR:默认情况下,lib*.so.*在文件{PN}中,lib*.so在文件{PN}-dev中

这就是理解在哪个包中需要什么的背景。问题是-dev包应该只包含lib*.so符号链接到版本库(即lib*.so.*)。 人们通常希望有版本库,因此很容易知道安装了哪个版本,以及特定软件应该链接到哪个版本。如果版本不重要,或者主版本只重要,那么它们将链接到未版本或主版本符号链接到版本库。 最佳实践规定了这种行为

在两种可能的情况下,或者您只提供未版本库,在这种情况下,解决方案是在您的cmake或配方中对库进行版本设置。然后一切都开箱即用。 或者您有一个名为“未版本库”的版本库副本,在这种情况下,您应该删除副本,只需创建一个到版本库的符号链接

如果这不是一个选项(但请确实考虑一下),您可以尝试找到一种方法,使${Pn}-DEV不具有此库。 有多个选项:将lib*.so添加到文件${PN},或者从包中删除${PN}-dev,从文件${PN}-dev中删除lib*.so,取消设置文件${PN}-dev

$ bitbake studentlib
...
Build Configuration:
BB_VERSION           = "1.38.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "universal"
TARGET_SYS           = "arm-poky-linux-gnueabi"
MACHINE              = "qemuarm"
DISTRO               = "poky"
DISTRO_VERSION       = "2.5.2"
TUNE_FEATURES        = "arm armv5 thumb dsp"
TARGET_FPU           = "soft"
    ...
NOTE: Executing RunQueue Tasks
ERROR: studentlib-0.1-r0 do_package_qa: QA Issue: -dev package contains non-symlink .so: studentlib-dev path '/work/armv5e-poky-linux-gnueabi/studentlib/0.1-r0/packages-split/studentlib-dev/usr/lib/libtestStudent.so' [dev-elf]
ERROR: studentlib-0.1-r0 do_package_qa: QA run found fatal errors. Please consider fixing them.
ERROR: studentlib-0.1-r0 do_package_qa: Function failed: do_package_qa
ERROR: Logfile of failure stored in: /home/me/yocto-qemuarm-sumo/poky/build/tmp/work/armv5e-poky-linux-gnueabi/studentlib/0.1-r0/temp/log.do_package_qa.21681
ERROR: Task (/home/me/yocto-qemuarm-sumo/poky/meta-me/recipes-cmake/studentlib/studentlib_0.1.bb:do_package_qa) failed with exit code '1'