【问题标题】:Use private C++ runtime library on linux在 linux 上使用私有 C++ 运行时库
【发布时间】:2015-08-05 07:55:14
【问题描述】:

在 Windows 中,动态加载器总是首先在加载的可执行文件的路径中查找模块,从而可以在不影响系统库的情况下拥有私有库。

Linux 上的动态加载器仅在固定路径中查找库,因为它独立于所选的二进制文件。我需要 GCC 5 的溢出检查算术函数,但由于 C++ ABI 在 4.9 和 5 之间发生了变化,一些应用程序变得不稳定,重新编译它们解决了这个问题。在等待我的发行版 [kubuntu] 升级默认编译器时,是否可以让新编译的应用程序链接到新的运行时,而打包的应用程序仍然链接到旧库,无论是通过静态链接还是模仿 Windows 行为的东西?

模拟它的一种方法是创建一个包装脚本

#!/bin/bash
LD_LIBRARY_PATH=$(dirname $(which your_file)) your_file

在链接步骤之后复制受影响的库,但这有点像 hack。

【问题讨论】:

  • “Linux 上的动态加载器只查找固定路径中的库”——不,它不会,参见 LD_LIBRARY_PATH。
  • @Mat 是的,但它独立于它加载的图像文件
  • 你需要阅读更多关于 Linux 动态链接的内容。
  • @BasileStarynkevitch 我只是认为当前安装的编译器应该不会影响其他应用程序的行为。
  • 编译器与此无关。这是一个链接器问题。

标签: linux gcc dynamic-linking libstdc++


【解决方案1】:

您可以使用rpath

假设您的“新 ABI”共享库位于 /usr/local/newapi-libs

gcc -L/usr/local/newapi-libs
    -Wl,-rpath,/usr/local/newapi-libs
    program.cpp -o program -lsomething`

链接器的-rpath 选项是-L 的运行时对应项。以这种方式编译的程序运行时,链接器会先查找/usr/local/newapi-libs,然后再搜索系统库路径。

更多信息herehere

您可以通过指定 -Wl,-rpath,. 来模拟 Windows 查找可执行文件目录的行为

[编辑] 在rpath 之前添加了缺少的-L 参数和破折号。

【讨论】:

  • 对于 OP:-Wl,rpath 是链接器的参数。编译器只看到-Wl 并将其余部分传递给链接器。
  • @BasileStarynkevitch 我知道:“-Wl,将参数传递给链接器......”。为了完整性“-Wp,将参数传递给预处理器......”
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 2017-04-07
相关资源
最近更新 更多