如何链接到旧版本的共享库

时间:2014-01-09 10:19:51

标签: c++ c linux shared-libraries

我正在我的计算机上构建我的程序,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的符号链接更改为旧版本是否有害?如果没有,它会解决我的问题吗?

4 个答案:

答案 0 :(得分:2)

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

gcc [other options] -l:libtiff.so.4

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

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

答案 1 :(得分:1)

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

但是,我强烈建议不要这样做。问题是,安装的标头对应于较新版本的库。如果这些库版本之间存在API / ABI中断的更改,则程序可能会工作,间歇性崩溃,或者如果您很幸运,则根本不工作。

相反,您应该临时安装与libtiff.so.4库对应的开发包。如果在Debian / Ubuntu或类似的地方,这将是libtiff4-dev包。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

ln -fs libversionname libfile

示例:

ln -fs libomyapp.1.1.3 libomyapp.lib

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

但是,正如所说的,最好的工作方式是关闭您的应用程序,使其与预期的lib功能正确匹配,从而正常工作,而不会出现错误或问题。