7

我正在尝试使用 crosstools-ng 编译使用 pthread 的程序,但是由于某种原因,链接器找不到该库。我已经检查过,这些库位于-L参数指定的链接路径中。

这是错误:

/home/***/raspberrypi/toolchain/lib/gcc/arm-unknown-linux-gnueabi/4.6.3/../../../.. /arm-unknown-linux-gnueabi/bin/ld: cannot find /lib/arm-linux-gnueabihf/libpthread.so.0

/home/***/raspberrypi/toolchain/lib/gcc/arm-unknown-linux-gnueabi/4.6.3/../../../../arm-unknown-linux-gnueabi/bin/ld: cannot find /usr/lib/arm-linux-gnueabihf/libpthread_nonshared.a

为什么 ld 找不到路径内的文件?

4

3 回答 3

6

编辑您的 .../usr/lib/arm-linux-gnueabihf/libpthread.so:

/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf32-littlearm)
GROUP ( /lib/arm-linux-gnueabihf/libpthread.so.0 /usr/lib/arm-linux-gnueabihf/libpthread_nonshared.a )

/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf32-littlearm)
GROUP ( libpthread.so.0 libpthread_nonshared.a )
于 2013-12-17T16:36:59.620 回答
2

请参阅此信息页面: https ://sourceware.org/binutils/docs-2.24/ld/File-Commands.html#File-Commands

阅读 INPUT 和 GROUP 的定义,特别是:

如果配置了 sysroot 前缀,并且文件名以 `/' 字符开头,并且正在处理的脚本位于 sysroot 前缀内,则将在 sysroot 前缀中查找文件名。否则,链接器将尝试打开当前目录中的文件。如果没有找到,链接器将通过归档库搜索路径进行搜索。请参阅命令行选项中的“-L”描述。

所以你的链接器脚本应该是:

/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf32-littlearm)
GROUP ( /lib/libpthread.so.0 /usr/lib/libpthread_nonshared.a )

...因为您的工具链使用的是 sysroot 前缀。

您可以使用以下命令找到您的 sysroot 前缀:

<tuple>-gcc -print-sysroot
于 2014-03-19T21:09:10.793 回答
1

使用 GCC--sysroot=dir标志应该可以解决问题。这个标志告诉 GCC 搜索dir文件夹下的头文件和库。

在您的情况下,如果您添加--sysroot=/home/user/rpi_root到链接器标志,ld将搜索/home/user/rpi_root/lib/libpthread.so.0而不是仅搜索/lib/libpthread.so.0.

这对于修复与库的完整路径的链接特别有用。

使用 CMake 生成构建系统时,应使用SET(CMAKE_SYSROOT ${RPI_ROOT_PATH}), 其中RPI_ROOT_PATH包含 RPi sysroot 的路径,而不是直接设置编译器标志。

于 2017-01-10T15:58:15.890 回答