gcc链接器(ld)找不到共享库

时间:2015-04-30 12:16:22

标签: linux gcc linker cross-compiling ld

我正在尝试使用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 <它也无法链接到pthread库/强>

错误消息是:

../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 var。

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来查找正在发生的事情...我不知道发生了什么但是它试图在几个dirs中打开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)

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

这是将 ARM's toolchain 用于 arhmf。