解决 C++ 链接到一个绝对路径的动态链接库

作者: , 共 629 字 , 共阅读 0

最近升级系统,出现好多莫名其妙的问题。其中一个便是 G++编译后,发现其中一个动态链接库引用了绝对地址。正常情况下运行ldd bin/auto应该是下面的结果:

libqtutil.so => /home/zhangzq/lib/libqtutil.so (0x00007f8603d17000)
libboost_system.so.1.75.0 => /opt/lib/libboost_system.so.1.75.0 (0x00007f8603d12000)

但实际得到下面的结果:

/home/zhangzq/lib/libqtutil.so (0x00007f8603d17000)
libboost_system.so.1.75.0 => /opt/lib/libboost_system.so.1.75.0 (0x00007f8603d12000)

如果readelf -d bin/auto可以看到/home/zhangzq/lib/libqtutil.so整个绝对路径都被编码到了依赖项。而正常应该是libqtutil.so。这会带来问题,其它人无法访问我个人目录下的文件,导致无法运行程序。

最后用的解决方法是为libqtutil.so添加SONAME,在编译时添加选项:

g++ -Wl,-soname,libqtutil.so ...

但:

  • 为什么这样,不明。
  • 为什么能解决,不明。

留待后续研究。

Q. E. D.

类似文章:
相似度: 0.269
编程 » C++, GCC, 编译链接
C++的链接分为两部分,一个是编译时,一个是运行时。但运行时的行为也收到编译参数的影响。
编程 » C++, GCC, 编译链接
LD 在链接生成目标文件时,会从左到有扫描输入的依赖库,当依赖库之间也有依赖关系时,必须将「依赖别人的库」放在「被别人依赖的库」的前面。否则会链接失败!失败的症状有:
最近老遇到一个奇怪的问题。在 VS 2013 编译时,爆出很多警告:
编程 » C++, 编译
一个典型的 GCC C++编译过程为:
编程 » Python
Python 在搜索模块时,依次搜索sys.path里的位置,直到找到模块为止。下面命令可以查看当前的搜索路径:
编程 » C++, log
先编译 libfmt.a :
相似度: 0.068
boost是除std外最常用的 C++库,覆盖很多常用操作。目前最新的版本是1.85.0http://boost.org/上可以查看最新版本号,将下面的 59 换成最新的即可)。
编程 » C++
要在C++中运行系统命令,可以直接使用std::system函数:
一个好用的 C++性能分析工具需满足几个条件:
2020 年带张君宝累计爬山 24 次,总里程 165 公里,总爬升 10660 米。
编程 » Python
imp.load_source在动态载入 python 模块时非常有用,但需要注意其特性。