Mar*_*uko 3 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 << "A student with name " << this->name << endl;
}
Run Code Online (Sandbox Code Playgroud)
这是一种 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)
Run Code Online (Sandbox Code Playgroud)
这是食谱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 = ""
Run Code Online (Sandbox Code Playgroud)
问题是当我构建特定配方 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'
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?我找不到任何例子来解释。
谢谢
在 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 中定义,参见http://git.yoctoproject.org/cgit.cgi/poky/tree/meta/conf/bitbake.conf。查找以 FILES_ 开头的所有内容。
在那里,您可以看到默认情况下,FILES_${PN} 有 ${libdir}/lib*${SOLIBS} (参见http://git.yoctoproject.org/cgit.cgi/poky/tree/meta/conf /bitbake.conf#n296)打包。SOLIBS 默认为 .so.* (参见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#n313,http://git.yoctoproject.org/cgit.cgi/poky/tree/meta/ conf/bitbake.conf#n314和http://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} -开发,...
| 归档时间: |
|
| 查看次数: |
5317 次 |
| 最近记录: |