【问题标题】:Yocto / OE : recipe with CMake install a shared library .soYocto / OE:使用 CMake 的配方安装共享库 .so
【发布时间】:2019-11-28 15:20:35
【问题描述】:

我需要弄清楚如何基于 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;
}

这是一种 CMakeList.txt

cmake_minimum_required(VERSION 2.8.9)
project(directory_test)
set(CMAKE_BUILD_TYPE Release)

#Bring the headers, such as Student.h into the project
include_directories(include)

#However, the file(GLOB...) allows for wildcard additions:
file(GLOB SOURCES "*.cpp")

#Generate the shared library from the sources
add_library(testStudent SHARED ${SOURCES})

#Set the location for library installation
install(TARGETS testStudent DESTINATION lib)
install(FILES student.h DESTINATION include)

这是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'

我该如何解决这个问题? 我找不到任何解释的例子。

谢谢

【问题讨论】:

    标签: cmake shared-libraries yocto


    【解决方案1】:

    在 Yocto 中,文件(在 do_install 中手动安装或在 do_compile 中通过 make、cmake、autotools 等安装在 ${D} 中)在匹配正则表达式之一时被放入包中(或 glob,不完全确定)包含在 FILES_foo 中。

    一个配方可以(而且通常确实)提供多个包。所以你会有多个 FILES_foo1 有自己的路径来匹配。

    在 Yocto 中,文件放在第一个包中,其中 FILE_foo 中的一个路径与文件匹配。即使该文件与其他包的路径匹配,它也只会出现在一个包中,即第一个包中。

    FWIW,包是在配方中的 PACKAGES 变量中从最左到右创建的。默认情况下,PACKAGES 变量是 ${PN}-src ${PN}-dbg ${PN}-staticdev ${PN}-dev ${PN}-doc ${PN}-locale ${PACKAGE_BEFORE_PN} ${PN }(参见http://git.yoctoproject.org/cgit.cgi/poky/tree/meta/conf/bitbake.conf#n292)。

    默认的 FILES_* 变量也在 bitbake.conf 中定义,c.f. http://git.yoctoproject.org/cgit.cgi/poky/tree/meta/conf/bitbake.conf。查找以 FILES_ 开头的所有内容。

    在那里,您可以看到默认情况下,FILES_${PN} 已打包 ${libdir}/lib*${SOLIBS} (c.f. http://git.yoctoproject.org/cgit.cgi/poky/tree/meta/conf/bitbake.conf#n296)。 SOLIBS 默认为 .so.* (c.f. http://git.yoctoproject.org/cgit.cgi/poky/tree/meta/conf/bitbake.conf#n280),这意味着只有点版本的库被打包在 ${PN} 包中(如果它们之前没有被另一个包匹配)。另一方面,FILES_${PN}-dev 软件包 ${FILES_SOLIBSDEV} 默认为 ${base_libdir}/lib*${SOLIBSDEV} ${libdir}/lib*${SOLIBSDEV},而 SOLIBSDEV 依次默认为 .so (参见http://git.yoctoproject.org/cgit.cgi/poky/tree/meta/conf/bitbake.conf#n313http://git.yoctoproject.org/cgit.cgi/poky/tree/meta/conf/bitbake.conf#n314http://git.yoctoproject.org/cgit.cgi/poky/tree/meta/conf/bitbake.conf#n283)。请注意,库文件名都应以 lib 开头,以便能够与默认 FILES_* 匹配。

    TL;DR:默认情况下,FILES_${PN} 中的 lib*.so.* 和 FILES_${PN}-dev 中的 lib*.so。

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

    两种可能的情况,要么您只提供未版本化的库,在这种情况下,解决方案是在您的 cmake 或配方中对您的库进行版本控制。然后一切都开箱即用。 或者您有一个名为非版本库的版本库副本,在这种情况下,您应该删除您的副本并只创建指向版本库的符号链接。

    如果这不是一个选项(但请认真考虑),您可以尝试找到一种方法,使 ${PN}-dev 没有这个库。 有多种选择:将 lib*.so 添加到 FILES_${PN} 并从 PACKAGES 中删除 ${PN}-dev,从 FILES_${PN}-dev 中删除 lib*.so,取消设置 FILES_${PN} -开发,...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 2021-10-11
      • 2019-02-03
      相关资源
      最近更新 更多