- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不是没有经验,但我很清楚我在交叉编译和 sysroots 领域缺乏一些基本的了解。我希望有人可以向我提供我需要继续的宝贵信息。
我已经下载了一个预构建的 armhf gcc 交叉编译器/工具链,它带有一个名为 arm-linux-gnueabihf
的目录,其中包含以下目录:
bin/
include/
lib/ - contains libstdc++.a, libgcc_s.so, but does NOT contain `libcrypt.so` or `libcrypt.so.1`, etc.
libc/
奇怪的是 libc
包含另一组目录,看起来有点像一个单独的 sysroot,但我不确定它为什么会在这里。我查看了其他工具链,包括我自己用 crosstool-ng 构建的工具链,但没有看到任何类似的东西:
libc/
etc/
lib/ - contains files like libcrypt.so.1 / libcrypt-2.24.so
sbin/
usr/
bin/
include/
lib/ - contains files like libc.a, libc.so, libcrypt.a, libcrypt.so,
libexec/
sbin/
share/
var/
无论如何,我不确定这是否是一个问题,或者我是否必须将这两个 sysroots 合并为一个
我已将它安装在路径 /cross-pi-gcc-9.1.0-1
的 Docker 容器中。我是用cmake交叉编译的,我的toolchain.cmake文件引用了这个工具链:
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_C_COMPILER /cross-pi-gcc-9.1.0-1/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER /cross-pi-gcc-9.1.0-1/bin/arm-linux-gnueabihf-g++)
SET(CMAKE_FIND_ROOT_PATH /cross-pi-gcc-9.1.0-1/arm-linux-gnueabihf/)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
这似乎足以使用交叉编译器(包括 Boost)构建大多数代码。
作为这个容器的一部分,我希望在 sysroot 中安装 WiringPi,这样我就可以构建和链接它。
为此,我创建了一个自定义的 CMakeLists.txt
文件,该文件成功构建并安装了 WiringPi:
cmake_minimum_required(VERSION 3.0)
project(WiringPi)
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
find_package(Threads REQUIRED)
add_library(wiringPi SHARED ads1115.c <snip a bunch of .c files>)
target_include_directories(wiringPi PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(wiringPi PUBLIC ${CMAKE_THREAD_LIBS_INIT} crypt m rt)
install(TARGETS wiringPi DESTINATION lib)
install(FILES ads1115.h <snip a bunch of .h files>
DESTINATION include)
这表明生成的 libwiringpi.so
应该与 libcrypt
、libpthread
、libm
和 库
。如果我在 libwiringpi.so
上运行目标的 ldd
工具,它确实会将这些库显示为依赖项:
$ ldd libwiringPi.so
linux-vdso.so.1 (0x7eee6000)
/usr/lib/arm-linux-gnueabihf/libarmmem-${PLATFORM}.so => /usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so (0x76f0a000)
libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0x76ee0000)
libcrypt.so.1 => /lib/arm-linux-gnueabihf/libcrypt.so.1 (0x76ea0000)
libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0x76e1e000)
librt.so.1 => /lib/arm-linux-gnueabihf/librt.so.1 (0x76e07000)
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x76cb9000)
/lib/ld-linux-armhf.so.3 (0x76f43000)
我遇到的问题是我有一个应用程序使用这样的 cmake 行链接到 wiringpi:
target_link_libraries(myapp wiringPi)
当我使用本地工具链在树莓派上构建它时,我不需要显式链接到 libcrypt
。但在我的 Docker/交叉编译器环境中,我在链接时收到此错误:
/cross-pi-gcc-9.1.0-1/bin/arm-linux-gnueabihf-g++ CMakeFiles/app.dir/main.cpp.o -o myapp -lpthread -lwiringPi -lrt
/cross-pi-gcc-9.1.0-1/bin/../lib/gcc/arm-linux-gnueabihf/9.1.0/../../../../arm-linux-gnueabihf/bin/ld: warning: libcrypt.so.1, needed by /cross-pi-gcc-9.1.0-1/bin/../lib/gcc/arm-linux-gnueabihf/9.1.0/../../../../arm-linux-gnueabihf/lib/libwiringPi.so, not found (try using -rpath or -rpath-link)
/cross-pi-gcc-9.1.0-1/bin/../lib/gcc/arm-linux-gnueabihf/9.1.0/../../../../arm-linux-gnueabihf/lib/libwiringPi.so: undefined reference to `crypt@GLIBC_2.4'
collect2: error: ld returned 1 exit status
请注意,-lrt
和-lpthread
似乎已自动包含在链接库列表中。但是 -lcrypt
不存在。
如果我复制/粘贴与此错误对应的 make VERBOSE=1
输出,并手动将 -lcrypt
添加到命令末尾,它会成功链接并且应用程序编译完成。
我意识到这是一个很长的描述,但我最终想做的是找到我的知识中的漏洞,它阻止我理解为什么我需要明确地将 libcrypt
链接到这个应用程序中在这种环境下。
我本来以为,也许是错误的,因为 libwiringpi.so
已经链接到 libcrypt
,所以它不需要在顶层链接。如果这不是它的工作原理,请问有没有人可以帮助我修复我的心智模型?
注意:我可以只添加 target_link_libraries(myapp wiringPi crypt)
但是我认为没有必要(在本地构建时不需要)并且我想了解更多关于这个过程的信息而不仅仅是寻找解决方法。
最佳答案
我自己回答...
看起来 sysroot 中存在 libc
目录是不正常的,我检查了其他工具链,它总是与 lib
合并。所以我最终放弃了那个特定的工具链,转而使用 crosstool-ng
构建我自己的工具链。这完全避免了这个问题。很高兴了解我是如何让这个工作的,但现在我必须继续前进。
请注意,我仅使用 CMAKE_SYSROOT
就成功了 - 在我的情况下无需指定 CMAKE_FIND_ROOT_PATH
和 friend 。
关于cmake - 交叉编译并链接到 sysroot 中的库 - 怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58073824/
MacOS Mojave 版本10.14(18A389)。 今天,我将Xcode更新为版本10.0(10A255)。当我尝试构建我的Qt项目时结束,我得到一个错误: clang: warning: n
我使用 sshfs 将目标设备(Beaglebone Black、ARM arch)的根安装到主机上的一个文件夹,并尝试使用 GCC 的 --sysroot 选项进行交叉编译。 但有一个问题 - 一些
我正在使用 QT 和嵌入式设备,在许多文档项目 ( like here ) 中,他们都在谈论 sysroots。我在网上搜索过,但找不到任何关于 sysroot 是什么的信息。不过我有一个交叉编译器工
我有一个必须为主机和目标构建的包 (openssl)。它创建了一些 .so 和 .a 库,一些其他包分别在运行时和编译时需要这些库。 当我为目标编译这个包时,一切正常,每个文件最终都在我告诉它去的地方
我不是没有经验,但我很清楚我在交叉编译和 sysroots 领域缺乏一些基本的了解。我希望有人可以向我提供我需要继续的宝贵信息。 我已经下载了一个预构建的 armhf gcc 交叉编译器/工具链,它带
目录recipe-sysroot-native占用200M+磁盘空间,我发现它存在于每个WORKDIR中,我认为它们都有保存内容。拥有这么多副本是一种磁盘空间的浪费,而且可能会减慢构建时间。能不能放在
我正在尝试使用 Linux Mint 64 位存储库中的 arm-linux-gnueabi-gcc 为诺基亚 N9 手机交叉编译程序(目前来自 libav 的 avconv)。编译器的libc版本是
--sysroot当您不希望标准路径中的 header /库影响您的构建时, switch 很有用。 --sysroot=dir: Use dir as the logical root direct
当您不希望标准路径中的 header /库影响您的构建时,--sysroot 开关非常有用。 --sysroot=dir: Use dir as the logical root directory
我设置了this我的 Windows 机器上的 Pi 工具链 (raspberry-gcc4.6.3-nosysroot.exe),然后我按照说明操作 here同步我的 sysroot。 我在项目中使
我正在尝试安装 cydia 源代码。 $ git clone git://git.saurik.com/cydia.git $ cd cydia 但是当我输入“./sysroot.sh”时出现了这个错
我正在用 Android 编译一个简单的程序 NDK Linux build在 Ubuntu Linux 10.0.4 上。 //no includes!!! int main() { i
我在使用 CMAKE 设置交叉编译时遇到了一些问题。我使用的工具链是在 yocto 中创建的,它可以在 cmake 之外完美运行。 我按照教程设置了以下工具链文件: SET(CMAKE_SYSTEM_
我正在尝试使用 --host=x86_64-apple-darwin10 和 --target=ppc64-linux 构建 GCC 交叉编译器。 我的目标需要一个 sysroot。我可以使用的是一个
感谢 crosstool-ng,我有一个可用的交叉编译器工具链 :) -- 然而,crosstool-ng 的文档非常稀少,而且我是交叉编译的新手。我认为在这种情况下,具体的宿主和目标并不重要。 我有
我正在查看可以为 configure 运行的所有选项Qt 提供的脚本。 (特别是 qt-everywhere-opensource-src-5.2.0)。 经过大量搜索后,我确定这些东西充其量只是记录
我正在尝试根据编译标志(通过将 Application.mk 的路径动态传递给 ndk-build 命令)为 Android NDK 的多个体系结构和多个 API 级别编译源代码。直到r12一切顺利。
我在 CXXFLAGS 中设置了 sysroot当编译目标文件时,我可以在 cmd 行中看到 sysroot但是当构建 elf 时,我无法在 cmd 行中找到 sysroot,因此构建失败 那么如何正
我通过ssh使用sshfs在macbook中设置了odroid xu4板(arm板)的sysroot。这样我就可以看到 MacBook 上的所有文件夹和文件。我只是想知道它是否应该能够编辑此 sysr
我正在尝试交叉编译一个简单的代码片段 1 #include 2 #include 3 4 int main() 5 { 6 printf("%d\n", SOL_N
我是一名优秀的程序员,十分优秀!