链接期间我发出以下警告:
/usr/bin/ld: warning: libxxx.so.6, needed by /a/b/c/libyyy.so, not found (try using -rpath or -rpath-link)
设置环境变量LD_LIBRARY_PATH = path_to_libxxx.so.6使警告静音(添加-Lpath_to_libxxx.so.6无效)。
我有一个单独的编译服务器,其中生成的二进制文件只是编译。
二进制文件在其他服务器上执行,二进制文件看到libxxx.so.6(用ldd executable
检查)。
是否还有其他方法可以在编译时删除警告(我已经好几次并且非常讨厌)?
答案 0 :(得分:35)
您需要添加等效于-L
的动态库:
-Wl,-rpath-link,/path/to/lib
这将导致链接器在非标准位置查找共享库,但仅用于验证链接是否正确。
如果您希望程序在运行时的那个位置找到库,那么有类似的选项:
-Wl,-rpath,/path/to/lib
但是,如果没有这个程序你的程序运行良好,那么你就不需要它了。
答案 1 :(得分:5)
确保运行时链接程序知道所需库的路径。这是通过在/etc/ld.so.conf.d/中添加带有所需路径的文件来完成的。例如,/ etc / ld.so.conf.d / foo,其中包含以下内容:
/usr/local/lib/foo/
如果您有一个非常旧的Linux版本,可能不支持/etc/ld.so.conf.d/,在这种情况下,您可能必须将路径直接添加到/etc/ld.so.conf文件中
完成后,您需要通过执行“ldconfig”命令来更新链接器的数据库。
答案 2 :(得分:1)
我知道这是旧的,但是here's a better fix:
根本原因:
当GCC调用的LD开始解析时,实际上会发生问题 库依赖。 GCC和LD都知道sysroot 包含库,但LD可能缺少一个关键 component:/etc/ld.so.conf文件。这是一个exampleld.so.conf文件 来自Raspberry PI系统:
包括/etc/ld.so.conf.d / * .conf
/etc/ld.so.conf.d目录包含以下文件:
<强> 00-vmcs.conf:强> /选择/ VC / lib中
<强>臂-Linux的gnueabihf.conf:强>
/ lib / arm-linux-gnueabihf / usr / lib / arm-linux-gnueabihf
<强> libc.conf:强>
的/ usr /本地/ lib中
通用解决方案
通过复制LD配置文件可以轻松解决问题 到交叉工具链的LD可以找到它们的位置。有 然而,一个陷阱:如果您的交叉工具链是使用MinGW构建的 (大多数是),它可能没有访问glob()函数所以 它将无法解析支持通配符的include语句 像* .conf文件。这里的解决方法是手动组合 来自/etc/ld.so.conf.d的所有.conf文件的内容并粘贴它们 进入 /etc/ld.so.conf
* /选择/ VC / lib中
/ LIB /臂-Linux的gnueabihf
/ usr / lib中/臂-Linux的gnueabihf
的/ usr /本地/ lib中*
在正确的文件夹中创建ld.so.conf文件后,您的 工具链将能够解析所有共享库引用 自动,您将不会再看到该错误消息!
答案 3 :(得分:0)
使用命令行选项使这些警告静音的唯一方法是-L标志,奇怪地不适合你(也许你可以发布更多关于此的细节)。由于警告是由ld
生成的,我们可以尝试使用-Wl,option
来禁用链接器警告,但是从documentation of GNU ld开始,没有(de)激活此警告的选项。
因此,这使我们编写了一个过滤掉此警告的包装脚本,或者编译ld
的自定义版本。