我正在我的计算机上构建我的程序,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
的符号链接更改为旧版本是否有害?如果没有,它会解决我的问题吗?
答案 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功能正确匹配,从而正常工作,而不会出现错误或问题。