我每天都和 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"
脚本继续。正如您在此处看到的,当您获取此文件时,会设置许多环境变量。我不想让你感到困惑,所以我不会过多地评论为什么像这样设置这些变量通常不是一件好事。
相反,我将解释为什么您可以使用这些变量构建代码,但不能没有。
CC 和 CXX 设置编译器 linux 用于构建代码。它们被设置为使用/opt/poky 提供的交叉编译工具链,因为它们被添加到PATH 的前面。 LD 和 AS 设置链接器,以防万一。
继续,注意脚本如何设置--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/include 和 libarchive.so in SYSROOT_DIR/usr/lib。
现在有了我提到的这些环境设置,您的项目可以使用提供的工具链成功交叉编译。
最后一个谜是为什么没有环境就无法构建项目。事实证明,这根本不是一个谜。原因很简单,简单而乏味:你只是缺少真正的/usr/include 上的头文件archive.h。所以你的普通编译器,gcc 很可能在那里找不到它。
如果你想在你的 x86 linux 机器上构建你的项目,你只需要安装依赖项。例如,在 Ubuntu 上,只需这样做:
sudo apt install libarchive-dev
安装依赖。然后就可以在 x86 上成功构建了。
现在我已经揭开了你看到的错误的神秘面纱,我有义务告诉你,像poky 这样设置这些变量通常不适合现代项目。现代 C/C++ 项目,当正确使用 cmake 时,可以轻松地跨平台移植,而不需要太多麻烦,尤其是不需要也不应该设置 CFLAGS、CXXFLAGS、LDFLAGS 等。cmake 工具链文件是一切你需要的。但这超出了回答这个特定问题的范围,所以最好谷歌一下。
HTH。