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

7
我正在自己的计算机上构建我的程序,其中 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来实现。 - jmlemetayer
在链接时,使用.so.4的完整路径而不是通常的-ltiff如何?(您还需要针对libtiff4兼容的头文件进行编译)。 - n. m.
编译器无法找到共享库的位置。我猜你需要传递路径。 - Dayal rai
1
另一种方法:mkdir /tmp/lib; ln -s /usr/lib/libtiff.so.4 /tmp/lib/libtiff.so; ld -L /tmp/lib ... - n. m.
4个回答

4
你可以使用以下语法链接到库的特定版本:
gcc [其他选项] -l:libtiff.so.4
你不需要指定路径,通常会按顺序搜索目录以查找库。
注意:正如Michael Wild所提到的那样,您应该安装该版本的头文件而不是最新的头文件。

你能指出这个功能在哪里有文档吗?我在查阅gcc的文档时没有找到相关信息。 - cmaster - reinstate monica
@cmaster 这在链接器的文档中有详细说明(man ld)。请查找 -l 选项。 - Nikos C.
啊,找到了。谢谢。 - cmaster - reinstate monica

2
正如其他人所提到的,您可以通过指定完整的版本名称甚至绝对路径来强制链接器。
然而,我强烈建议不要这样做。问题在于安装的头文件对应于较新版本的库。如果这些库版本之间存在API/ABI破坏性更改,则程序可能工作、间歇性崩溃或者幸运的是根本无法工作。
相反,您应该临时安装与libtiff.so.4库相对应的开发包。如果在Debian/Ubuntu或类似系统中,这将是libtiff4-dev软件包。

0

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


0

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

ln -fs libversionname libfile

例子:

ln -fs libomyapp.1.1.3 libomyapp.lib

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

但正如所说,最好的方法是将您的应用程序降级以正确匹配预期的库功能,以便无错误或问题地工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接