【问题标题】:gcc linker (ld) can't find shared librariesgcc 链接器 (ld) 找不到共享库
【发布时间】:2015-04-30 12:16:21
【问题描述】:

我正在尝试使用 linaro-gcc 和专用的 rootfs 交叉编译 iMX6 CPU 的应用程序。该应用程序可能链接到 OpenVG 和标准 pthread 库。

它编译得很好,但链接器无法链接到 OpenVG 库,所以我添加了链接器开关 -L/home/ae/Documents/toradex/col-imx6/colibri-imx6-sdk/usr /lib 现在它链接到 OpenVG 库。但从那时起,即使使用链接器 swtich -L/home/ae/Documents/toradex/col-imx6/colibri-imx6-sdk/lib。

错误信息是:

../arm-linux-gnueabihf/bin/ld: cannot find /lib/libpthread.so.0
../arm-linux-gnueabihf/bin/ld: cannot find /usr/lib/libpthread_nonshared.a

这些库位于 /home/ae/Documents/toradex/col-imx6/colibri-imx6-sdk/lib 目录中。

这是 LDFLAGS 变量。

LDFLAGS = -lpthread -lOpenVG -L/home/ae/Documents/toradex/col-imx6/colibri-imx6-sdk/lib -L/home/ae/Documents/toradex/col-imx6/colibri-imx6-sdk/usr/lib

有谁知道为什么 ld 无法链接到这些库,即使我添加了 -L 开关来告诉它在哪里可以找到它们?

编辑 2015 年 4 月 30 日 16:55
我使用 strace 来查找发生了什么...我不知道发生了什么,但它会尝试在几个目录中打开 libpthread.so,即使是在正确的目录中,但它没有与它链接。
这是输出。

open("/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib/i386-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib/i386-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib/i386-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/home/ae/Documents/toradex/col-imx6/colibri-imx6-sdk/lib/libpthread.so", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/home/ae/Documents/toradex/col-imx6/colibri-imx6-sdk/lib/libpthread.a", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/home/ae/Documents/toradex/col-imx6/colibri-imx6-sdk/usr/lib/libpthread.so", O_RDONLY|O_LARGEFILE) = 3
open("/home/ae/Documents/toradex/col-imx6/colibri-imx6-sdk/usr/lib/libpthread.so", O_RDONLY) = 4
open("/home/ae/Documents/toradex/col-imx6/colibri-imx6-sdk/usr/lib/libpthread.so", O_RDONLY) = 3
open("/lib/libpthread.so.0", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/libpthread_nonshared.a", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)

【问题讨论】:

  • 也许您使用的不是交联剂而是本机的。还要记住,如果你使用 GCC,你应该使用gcc(或交叉编译器变体)作为链接器而不是ld。
  • @rodrigo:我确实使用 cross gcc 和 cross ld。使用的链接器是 ../arm-linux-gnueabihf/bin/ld,如消息中所述,这是用于 arm CPU 的 linaro gcc 附带的链接器。我也使用跨 GCC 链接。

标签: linux gcc linker cross-compiling ld


【解决方案1】:

我使用编译器和链接器开关 --sysroot 修复了这个问题,因此链接器和编译器都使用 arm rootfs 作为基本目录。

【讨论】:

    【解决方案2】:

    在我的例子中,使用--verbose 运行 ld 表明它试图打开 libstatic.a(它不存在)而不是我想要的 libdynamic.so。我用-Bdynamic 修复了它。

    这是使用ARM's toolchain 进行 arhmf。

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 2021-08-26
      • 2013-04-15
      • 2016-02-17
      相关资源
      最近更新 更多