Linux 运行时链接器错误

Posted

技术标签:

【中文标题】Linux 运行时链接器错误【英文标题】:Linux runtime linker error 【发布时间】:2010-12-01 14:05:42 【问题描述】:

我正在学习 POCO 项目网站上的 First Steps 教程,并且我已经在我的主目录下成功构建了库(Debian Linux,2.6.26,gcc 4.3.2)

~/开发/POCO

与位于

中的共享库
~/Development/POCO/lib/Linux/x86_64/lib

我的问题是我构建的任何依赖这些库的应用程序只能从共享库目录运行。

~/Development/POCO/lib/Linux/x86_64$ ldd ~/Development/Cloud/DateTimeSample/bin/Linux/x86_64/DateTime linux-vdso.so.1 => (0x00007fffe69fe000) libPocoFoundation.so.6 (0x00007fa8de44f000) libpthread.so.0 => /lib/libpthread.so.0 (0x00007fa8de233000) libdl.so.2 => /lib/libdl.so.2 (0x00007fa8de02f000) librt.so.1 => /lib/librt.so.1 (0x00007fa8dde26000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fa8ddb1a000) libm.so.6 => /lib/libm.so.6 (0x00007fa8dd897000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fa8dd680000) libc.so.6 => /lib/libc.so.6 (0x00007fa8dd32d000) /lib64/ld-linux-x86-64.so.2 (0x00007fa8de7e0000)

从这个目录运行 DateTime 会像你期望的那样工作。不过

~/Development/Cloud/DateTimeSample/bin/Linux/x86_64$ ldd DateTime linux-vdso.so.1 => (0x00007fff24dfe000) libPocoFoundation.so.6 => 未找到 libpthread.so.0 => /lib/libpthread.so.0 (0x00007ffc1c7dd000) libdl.so.2 => /lib/libdl.so.2 (0x00007ffc1c5d9000) librt.so.1 => /lib/librt.so.1 (0x00007ffc1c3d0000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007ffc1c0c4000) libm.so.6 => /lib/libm.so.6 (0x00007ffc1be41000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007ffc1bc2a000) libc.so.6 => /lib/libc.so.6 (0x00007ffc1b8d7000) /lib64/ld-linux-x86-64.so.2 (0x00007ffc1c9f9000)

所以从任何其他目录运行可执行文件会导致

加载共享库时出错:libPocoFoundation.so.6:无法打开共享对象文件:没有这样的文件或目录

查看make过程的输出,正确指定了目录

g++ [废话] -L/home/npalko/Development/POCO/lib/Linux/x86_64 -lPoco基金会

我试过设置

LD_LIBRARY_PATH
/home/npalko/Development/POCO/lib/Linux/x86_64
,但它没有改变任何东西。任何帮助将不胜感激!

【问题讨论】:

啊,我的问题是我错误地设置了 LD_LIBRARY_PATH。更多的是对 Bash 的误解。非常感谢您的帮助! 【参考方案1】:

如果您不想处理LD_LIBRARY_PATH 变量,可以在gcc 命令行中添加链接器-rpath 选项。在你的情况下,这将是:

gcc ... -Wl,-rpath=/home/npalko/Development/POCO/lib/Linux/x86_64

这有效地硬编码了可执行文件中的路径,因此它可能适合也可能不适合您的目的。

【讨论】:

【参考方案2】:

这失败了?

LD_LIBRARY_PATH=/home/npalko/Development/POCO/lib/Linux/x86_64 ~/Development/Cloud/DateTimeSample/bin/Linux/x86_64/DateTime

只是认为您可能没有正确设置 LD_LIBRARY_PATH

还有这个?

ls -alh /home/npalko/Development/POCO/lib/Linux/x86_64/libPocoFoundation.so

如果两者都失败,我看不出原因。

【讨论】:

设置 LD_LIBRARY_PATH 通常是个坏主意:您的二进制文件(有时)对您有效,但对您的朋友无效,或者您忘记在演示之前设置它。在静态链接时使用 -rpath 通常是更好的选择。【参考方案3】:

您必须向链接器指定库的路径

g++ [blah] -Wl,-rpath=/home/npalko/Development/POCO/lib/Linux/x86_64

-Wl 表示您将选项传递给链接器

-rpath 是链接器选项

将目录添加到运行时库搜索路径。这是使用 将 ELF 可执行文件与共享对象链接时。所有 -rpath 参数被连接并传递给运行时链接器,它 使用它们在运行时定位共享对象。 -rpath 选项 也用于定位需要的共享对象 链接中明确包含的共享对象;

【讨论】:

+1。当 gcc 调用链接器时,我试图弄清楚如何使用 -R 进行链接。您的答案比接受的答案要好得多。谢谢!

以上是关于Linux 运行时链接器错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Xcode 中运行 iOS 单元测试时引用 _main 的链接器错误

在 MATLAB MEX 文件中使用 Thrust 的运行时链接器错误

当我尝试运行我的 Xcode 项目时,它显示我上传图像的链接器错误

linux中链接器的对应选项

在虚拟函数周围使用#ifdef预处理器会导致与库链接的程序出现运行时错误[关闭]

linux ldconfig命令的作用(Linker Configuration 链接器配置)更新动态链接库(共享库)的链接器程序缓存