gcc 链接器 (ld) 找不到共享库
gcc linker (ld) can't find shared libraries
我正在尝试使用 linaro-gcc 和专用的 rootfs 交叉编译 iMX6 CPU 的应用程序。该应用程序可能 linked 到 OpenVG 和标准 pthread 库。
它编译得很好但是 linker 无法 link 到 OpenVG 库所以我添加了 linker 开关 -L/home/ae/Documents/toradex/col-imx6/colibri-imx6-sdk/usr/lib 现在它 link 到 OpenVG 库。但是从那以后,即使使用 linker swtich -L/home/ae/Documents/toradex/col-imx6/colibri-imx6-sdk/lib[=37,它也无法 link 到 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 变量。
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 不能 link 那些库,即使我添加了 -L 开关告诉它在哪里可以找到它们?
2015 年 4 月 30 日编辑于 16:55
我使用 strace 来查找发生了什么......我不知道发生了什么,但它试图在几个目录中打开 libpthread.so,即使是在正确的目录中,但它没有 link。
这是输出。
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)
我使用编译器和链接器开关 --sysroot 解决了这个问题,因此链接器和编译器都使用 arm rootfs 作为基本目录。
在我的例子中,运行 ld with --verbose
显示它试图打开 libstatic.a(不存在)而不是我预期的 libdynamic.so。我用 -Bdynamic
.
修复了它
这是对 arhmf 使用 ARM's toolchain。
我正在尝试使用 linaro-gcc 和专用的 rootfs 交叉编译 iMX6 CPU 的应用程序。该应用程序可能 linked 到 OpenVG 和标准 pthread 库。
它编译得很好但是 linker 无法 link 到 OpenVG 库所以我添加了 linker 开关 -L/home/ae/Documents/toradex/col-imx6/colibri-imx6-sdk/usr/lib 现在它 link 到 OpenVG 库。但是从那以后,即使使用 linker swtich -L/home/ae/Documents/toradex/col-imx6/colibri-imx6-sdk/lib[=37,它也无法 link 到 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 变量。
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 不能 link 那些库,即使我添加了 -L 开关告诉它在哪里可以找到它们?
2015 年 4 月 30 日编辑于 16:55
我使用 strace 来查找发生了什么......我不知道发生了什么,但它试图在几个目录中打开 libpthread.so,即使是在正确的目录中,但它没有 link。
这是输出。
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)
我使用编译器和链接器开关 --sysroot 解决了这个问题,因此链接器和编译器都使用 arm rootfs 作为基本目录。
在我的例子中,运行 ld with --verbose
显示它试图打开 libstatic.a(不存在)而不是我预期的 libdynamic.so。我用 -Bdynamic
.
这是对 arhmf 使用 ARM's toolchain。