G++ 链接器以静默方式忽略库

G++ linker silently ignores a library

提问人:Petr Fiedler 提问时间:6/21/2023 更新时间:6/21/2023 访问量:30

问:

我需要将带有库的目标文件链接到可执行文件中,但由于链接器使用了错误的库版本,我不断收到未定义的引用错误。linker 命令非常简单,以下是简化版本:

g++ main.cpp.o -o main -Wl,-rpath,/path-to-dir/lib64:/path-to-dependency/lib: lib64/libWithDependencies.so -Wl,-rpath-link,/path-to-dependency/lib

当我用 运行它时,我看到了搜索库的标准过程,这是一个奇怪的问题。我需要链接.但是,在搜索过程中:-Wl,--verbose/path-to-dependency/lib/libINeed.so

  1. 在目录中-rpath-link
  2. 在目录中-rpath
  3. 在当前工作目录中
  4. LD_LIBRARY_PATH
  5. 等。

它在搜索时忽略(不打印任何有关)的内容,而是回退其版本要旧得多。目录路径存在于 和 中。奇怪的是,它会检查目录中所有其他库,甚至使用其中一些库。这让我相信这是文件的问题,但我再次没有收到有关链接器访问它的消息。/path-to-dependency/liblibINeed.so/usr/lib64/dependency/lib/libINeed.so-rpath-linkLD_LIBRARY_PATH

这应该不是版本的问题,因为名称匹配:

readelf -d lib64/libWithDependecies.so | grep libINeed.so
# 0x0000000000000001 (NEEDED)             Shared library: [libINeed.so]
readelf -d /path-to-dependency/lib/libINeed.so | grep SONAME
# 0x000000000000000e (SONAME)             Library soname: [libINeed.so]
readelf -d /usr/lib64/dependency/libINeed.so | grep SONAME
# 0x000000000000000e (SONAME)             Library soname: [libINeed.so.6.24]

更奇怪的是,当我运行时,它会找到正确的路径:ldd

ldd lib64/libWithDependencies.so | grep libINeed.so
#        libINeed.so => /path-to-dependency/lib/libINeed.so (0x00007f42b2aa4000)

链接器忽略库而不打印任何关于它的单词的原因可能是什么?

链接 G++ 链接器错误 ld

评论


答: 暂无答案