【问题标题】:How to add library for yocto poky?如何为 yocto poky 添加库?
【发布时间】:2021-02-24 10:52:36
【问题描述】:

这是我的 cmake 文件

cmake_minimum_required( VERSION 3.16.3)

project("Listing compressed files")

add_executable(list list.c)

target_link_libraries( list archive )

我得到了这个: 致命错误:archive.h:没有这样的文件或目录 5 | #include

【问题讨论】:

  • 分享您的 bitbake 食谱也会有所帮助。
  • @vermaete 我是初学者,所以我不确定这意味着什么。我运行这个命令。 /opt/poky/3.1.3/environment-setup-aarch64-poky-linux 。在此 cmake 为 Raspi 编译之后。
  • 您没有提供足够的信息让我们回答您的问题。你是如何设置环境的?你添加了什么文件?你运行了哪些命令?逐步提供此信息将有助于我们为您提供帮助。
  • 我每天都和 yocto poky 一起工作,所以我可以猜到这里会发生什么。当她/他指出 OP 中缺少信息时,@Ola 是正确的。关键在于您为环境提供的脚本。它包含一些奇怪的东西来交叉编译你的项目。我不确定你是否可以在这里公开整个剧本。让我确定几个小时后我什么时候上班。我会尽量解释清楚。 :-)

标签: cmake raspberry-pi shared-libraries yocto


【解决方案1】:

我每天都和 yocto poky 一起工作,所以我知道这里发生了什么。在我写这个答案时,我无法编辑 OP,因为“建议的编辑队列已满”。所以我就在这里填写详细信息。

OP 缺少有关当前问题的重要信息。这是我的猜测:


// list.c

// ...
// Line 5 below
#include <archive.h>
// ...
# CMakeLists.txt: same as OP

cmake_minimum_required( VERSION 3.16.3)

project("Listing compressed files")

add_executable(list list.c)

target_link_libraries( list archive )

您在评论部分提到脚本是源代码,以便它可以成功编译。如果没有该脚本,您将收到错误 no such file or directory: archive.h。那么这里发生了什么?

这背后的原因其实很简单,秘诀就在于源代码。

这是该文件中的相关行: (注:我用的是2.4.2,你的是3.1.3,不过应该很相似吧。)

export PATH=/opt/poky/2.4.2/sysroots/x86_64-pokysdk-linux/usr/bin:/opt/poky/2.4.2/sysroots/x86_64-pokysdk-linux/usr/sbin:/opt/poky/2.4.2/sysroots/x86_64-pokysdk-linux/bin:/opt/poky/2.4.2/sysroots/x86_64-pokysdk-linux/sbin:/opt/poky/2.4.2/sysroots/x86_64-pokysdk-linux/usr/bin/../x86_64-pokysdk-linux/bin:/opt/poky/2.4.2/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux:/opt/poky/2.4.2/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux-musl:$PATH
export SDKTARGETSYSROOT=/opt/poky/2.4.2/sysroots/aarch64-poky-linux
export CC="aarch64-poky-linux-gcc  -march=armv8-a -mtune=cortex-a57.cortex-a53 --sysroot=$SDKTARGETSYSROOT"
export CXX="aarch64-poky-linux-g++  -march=armv8-a -mtune=cortex-a57.cortex-a53 --sysroot=$SDKTARGETSYSROOT"
export CPP="aarch64-poky-linux-gcc -E  -march=armv8-a -mtune=cortex-a57.cortex-a53 --sysroot=$SDKTARGETSYSROOT"
export AS="aarch64-poky-linux-as "
export LD="aarch64-poky-linux-ld  --sysroot=$SDKTARGETSYSROOT"
export CFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types "
export CXXFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types "
export LDFLAGS="-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed"

脚本继续。正如您在此处看到的,当您获取此文件时,会设置许多环境变量。我不想让你感到困惑,所以我不会过多地评论为什么像这样设置这些变量通常不是一件好事。

相反,我将解释为什么您可以使用这些变量构建代码,但不能没有。

CCCXX 设置编译器 linux 用于构建代码。它们被设置为使用/opt/poky 提供的交叉编译工具链,因为它们被添加到PATH 的前面。 LDAS 设置链接器,以防万一。

继续,注意脚本如何设置--sysroot= 选项。总之,它告诉编译器和链接器使用这个 sysroot 路径 (/opt/poky/.../sysroots/aarch64-poky-inux) 作为搜索开始。这将引导交叉编译工具链,例如aarch64-poky-linux-gcc/opt/poky/..../aarch64-poky-linux/usr/include,又名SYSROOT_DIR/usr/include 中搜索像archive.h 这样的头文件,而不是通常的/usr/include,没有这个选项。 (--sysroot= 选项在交叉编译过程中非常常用)

更重要的是,poky 环境还包含 archive.h in SYSROOT_DIR/usr/includelibarchive.so in SYSROOT_DIR/usr/lib

现在有了我提到的这些环境设置,您的项目可以使用提供的工具链成功交叉编译。


最后一个谜是为什么没有环境就无法构建项目。事实证明,这根本不是一个谜。原因很简单,简单而乏味:你只是缺少真正的/usr/include 上的头文件archive.h。所以你的普通编译器,gcc 很可能在那里找不到它。

如果你想在你的 x86 linux 机器上构建你的项目,你只需要安装依赖项。例如,在 Ubuntu 上,只需这样做:

sudo apt install libarchive-dev

安装依赖。然后就可以在 x86 上成功构建了。


现在我已经揭开了你看到的错误的神秘面纱,我有义务告诉你,像poky 这样设置这些变量通常不适合现代项目。现代 C/C++ 项目,当正确使用 cmake 时,可以轻松地跨平台移植,而不需要太多麻烦,尤其是不需要也不应该设置 CFLAGSCXXFLAGSLDFLAGS 等。cmake 工具链文件是一切你需要的。但这超出了回答这个特定问题的范围,所以最好谷歌一下。

HTH。

【讨论】:

  • 感谢您的回答。我知道 /opt/poky/..../aarch64-poky-linux/usr/include 中的archive.h 的编译器搜索器。问题是其中不存在archive.h。如何在 /opt/poky/..../aarch64-poky-linux/usr/include 中添加 libarchive 库及其头文件?
  • @RudranshSrivastava 我很困惑。如果/opt/poky/.../usr/include 中不存在标头,为什么当您在 OP 中的注释中提到环境文件时,您的代码会成功编译?你能在/opt/poky 的任何地方找到archive.h 文件吗?
  • 对不起,我不清楚。当我使用 gcc 编译时,我能够编译这个文件,即当它使用 usr/include 时,但是当我使用 /opt/poky/.../usr/include 交叉编译时,它无法编译为库那里不存在。如何为 /opt/poky/.../usr/include 添加库?
  • 然后您可以尝试在环境开启的情况下从源代码交叉编译 libarchive。
  • 好的,所以我将通过这个逗号 /opt/poky/3.1.3/environment-setup-aarch64-poky-linux 设置我的环境。在这之后你能说出交叉编译 libarchive 库的步骤吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
  • 2018-03-15
  • 1970-01-01
  • 2020-12-24
  • 2018-06-16
  • 2015-11-23
  • 1970-01-01
相关资源
最近更新 更多