【问题标题】:How can I link to an older version of a shared library如何链接到旧版本的共享库
【发布时间】:2014-01-09 10:19:51
【问题描述】:

我正在我的电脑上构建我的程序,libtiff.so -> libtiff.so.5。 然后在 libtiff.so -> libtiff.so.4 所在的另一台机器上推送构建。

在运行时,我的程序存在:«加载共享库时出错:libtiff.so.5:无法打开共享对象文件:没有这样的文件或目录»。

我无法升级另一台机器,我想避免在虚拟机上编译(与执行机器具有相同的 linux 版本)。因此,我想强制编译器使用libtiff.so.4 而不是libtiff.so.5

我的计算机上安装了libtiff.so.4(以及libtiff.so.5)。如何强制与此版本而不是较新版本的链接。我考虑过移动libtiff.so -> libtiff.so.4,但如果它需要最新版本,我担心会破坏我的系统(apt-get purge libtiff5 会出错,因为其他一些软件包需要它)。

是否可以链接到旧(已安装)版本的库?如果是,如何? 将libtiff.so 的符号链接更改为旧版本是否有害?如果没有,它会解决我的问题吗?

【问题讨论】:

  • 也许可以使用LD_PRELOAD
  • 链接时使用 .so.4 的完整路径而不是通常的 -ltiff 怎么样? (您需要针对与 libtiff4 兼容的头文件进行编译)。
  • 编译器无法找到共享库的位置。我猜你也需要通过 PATH。
  • 另一种方式:mkdir /tmp/lib; ln -s /usr/lib/libtiff.so.4 /tmp/lib/libtiff.so; ld -L /tmp/lib ....

标签: c++ c linux shared-libraries


【解决方案1】:

您可以使用此语法链接到特定版本的库:

gcc [其他选项] -l:libtiff.so.4

您不需要指定路径;搜索通常的目录以找到库。

注意:正如 Michael Wild 所说,您应该安装该版本的头文件,而不是最新的。

【讨论】:

  • 您能指出此功能的记录位置吗?不知何故,我无法从 gcc 文档中查找它。
  • @cmaster 它记录在链接器 (man ld) 中。寻找-l 选项。
  • 啊,找到了。谢谢。
【解决方案2】:

正如其他人所提到的,您可以通过指定完整的版本名称,甚至是绝对路径来强制链接器。

但是,我强烈建议不要这样做。问题是,安装的头文件对应于较新版本的库。如果这些库版本之间发生了破坏 API/ABI 的更改,程序可能会运行、间歇性崩溃,或者如果幸运的话,根本无法运行。

您应该临时安装对应于 libtiff.so.4 库的开发包。如果在 Debian/Ubuntu 或类似系统上,这将是 libtiff4-dev 包。

【讨论】:

    【解决方案3】:

    指定 .so 的完整路径:而不是 -ltiff/lib64/libtiff.so.4 传递给链接器。

    【讨论】:

      【解决方案4】:

      您在应用程序运行时会看到该错误。因此,您可以停止您的应用程序,然后解压您的库 tar 文件。或者,在解压后强制将 lib 文件链接到较新的版本。在第二种情况下,您将使用类似:

      ln -fs libversionname libfile
      

      例子:

      ln -fs libomyapp.1.1.3 libomyapp.lib
      

      这会将您的libomyapp.lib 链接到指定的版本。这可以是您的旧版本或新版本。

      但如前所述,最好的工作方式是关闭您的应用程序以正确匹配预期的 lib 功能,以便在没有错误或问题的情况下工作。

      【讨论】:

        猜你喜欢
        • 2010-10-24
        • 2013-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多