【发布时间】:2020-11-11 09:27:18
【问题描述】:
我正在尝试在我的 ubuntu 机器上为我的树莓派(32 位 armv8)交叉编译一个项目。我使用 crosstool-NG 设置了一个工具链并进行了编译,但链接失败。我的 CMake 工具链文件如下:
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSROOT /home/stone/development/raspberry_pi/armv8-rpi3-linux-gnueabihf/armv8-rpi3-linux-gnueabihf/sysroot)
SET(CMAKE_C_COMPILER /home/stone/development/raspberry_pi/armv8-rpi3-linux-gnueabihf/bin/armv8-rpi3-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER /home/stone/development/raspberry_pi/armv8-rpi3-linux-gnueabihf/bin/armv8-rpi3-linux-gnueabihf-g++)
SET(CMAKE_FIND_ROOT_PATH /home/stone/development/raspberry_pi/armv8-rpi3-linux-gnueabihf)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
我有一些链接器没有找到的库。问题出在我的 sysroot 上。我将 /usr 和 /lib 从 pi 复制到我的 sysroot 文件夹,该文件夹由 crosstool-NG 创建。被链接的库位于sysroot/usr/lib/arm-linux-gnueabihf。
但是,链接器并没有检查那个目录,它检查 sysroot/usr/lib 和其他一些目录,但是由于某种原因它没有检查 arm-linux-gnueabihf 目录。
在 pi 上,我可以运行 ld -lasound --verbose 并得到以下输出:
attempt to open //usr/local/lib/arm-linux-gnueabihf/libasound.so failed
attempt to open //usr/local/lib/arm-linux-gnueabihf/libasound.a failed
attempt to open //lib/arm-linux-gnueabihf/libasound.so failed
attempt to open //lib/arm-linux-gnueabihf/libasound.a failed
attempt to open //usr/lib/arm-linux-gnueabihf/libasound.so succeeded
所以它可以在 pi 上正确找到它。
当我使用 crosstool-NG 生成的 ld 做同样的事情时:
attempt to open /home/stone/development/raspberry_pi/armv8-rpi3-linux-gnueabihf/armv8-rpi3-linux-gnueabihf/bin/../sysroot/home/stone/x-tools/armv8-rpi3-linux-gnueabihf/armv8-rpi3-linux-gnueabihf/lib/libasound.so failed
attempt to open /home/stone/development/raspberry_pi/armv8-rpi3-linux-gnueabihf/armv8-rpi3-linux-gnueabihf/bin/../sysroot/home/stone/x-tools/armv8-rpi3-linux-gnueabihf/armv8-rpi3-linux-gnueabihf/lib/libasound.a failed
attempt to open /home/stone/development/raspberry_pi/armv8-rpi3-linux-gnueabihf/armv8-rpi3-linux-gnueabihf/bin/../sysroot/usr/local/lib/libasound.so failed
attempt to open /home/stone/development/raspberry_pi/armv8-rpi3-linux-gnueabihf/armv8-rpi3-linux-gnueabihf/bin/../sysroot/usr/local/lib/libasound.a failed
attempt to open /home/stone/development/raspberry_pi/armv8-rpi3-linux-gnueabihf/armv8-rpi3-linux-gnueabihf/bin/../sysroot/lib/libasound.so failed
attempt to open /home/stone/development/raspberry_pi/armv8-rpi3-linux-gnueabihf/armv8-rpi3-linux-gnueabihf/bin/../sysroot/lib/libasound.a failed
attempt to open /home/stone/development/raspberry_pi/armv8-rpi3-linux-gnueabihf/armv8-rpi3-linux-gnueabihf/bin/../sysroot/usr/lib/libasound.so failed
找不到它,因为它没有在 arm-linux-gnueabihf 目录中查找。我将库 .so 文件从 sysroot/usr/lib/arm-linux-gnueabihf 复制到 sysroot/usr/lib 并成功编译和链接,但我想这样做,这样我就不必这样做了。如何让链接器检查 arm-linux-gnueabihf 目录?
编辑:我还将 /etc/ld.so.conf 和 /etc/ld.so.conf.d 从 pi 复制到我的 sysroot 中,但它似乎不会影响链接器。
编辑:经过进一步研究,这可能是由于 gcc-multiarch 造成的。我不确定那是什么,但希望我能解决这个问题
编辑:我确认链接器确实没有搜索 arm-linux-gnueabihf 路径:
./armv8-rpi3-linux-gnueabihf-ld --verbose | grep -i "search"
输出:
SEARCH_DIR("=/home/stone/x-tools/armv8-rpi3-linux-gnueabihf/armv8-rpi3-linux-gnueabihf/lib"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib");
【问题讨论】:
-
那么
/home/stone/development/raspberry_pi/armv8-rpi3-linux-gnueabihf/armv8-rpi3-linux-gnueabihf/bin/../sysroot/usr/lib/libasound.so存在吗? -
它没有。我不得不将它从 sysroot/usr/lib/arm-linux-gnueabihf/ 复制到 sysroot/usr/lib 以消除链接器错误。但我不想对每个图书馆都这样做。我想知道如何强制链接器检查 sysroot/usr/lib/arm-linux-gnueabihf/ 目录。
-
什么?那么具体是哪个目录呢?如果要搜索一些
sysroot/usr...路径,为什么将CMAKE_SYSROOT设置为/home/stone/development/....?How can I make the linker check that arm-linux-gnueabihf directory?“那个arm-linux-gnueabihf目录”到底是哪个目录? -
当我最初从 pi 复制它时,库文件位于 sysroot//usr/lib/arm-linux-gnueabihf/ 中。链接器似乎在那里找不到它。我可以通过手动将库文件从 sysroot/usr/lib/arm-linux-gnueabihf/ 复制到 sysroot/usr/lib 来修复它。链接器在将其放置在那里时会找到它。但不是放在 arm-linux-gnueabihf 目录中时。
-
但是
sysroot//usr/lib/arm-linux-gnueabihf/不是绝对路径,它不是以/开头的。什么是绝对路径? Ooooch,您写的是“sysroot”,而您的意思是根目录?所以没有/some/path/sysroot/usr/lib/arm-linux-gnueabihf/目录,sysroot是指系统上的根目录?
标签: c++ cmake linker cross-compiling linker-errors