手动链接共享对象文件

手动链接共享对象文件

最近,我一直在尝试编译和安装一个大型项目,陷入了嵌入式 Yocto Linux 项目的依赖地狱。我在安装依赖项时(通常在配置/制作/制作安装步骤期间)经常遇到找不到库的错误。我将快速查看一下/usr/libor /lib,果然,.so 文件就在那里。

例如,如果它抱怨找不到libfoo,我会查看/usr/lib并看到以下内容:

$ ls /usr/lib/libfoo*  
libfoo.so.3    libfoo.so.3.5.2

我发现链接器严格寻找libfoo.so,所以我创建了一个软链接:

$ ln -s /usr/lib/libfoo.so.3.5.2 /usr/lib/libfoo.so

然后链接器突然可以在编译过程中找到它并且很高兴。

为什么有时我需要这样做?从源代码手动安装依赖项时,这是否被认为是正常过程,或者我是否缺少一些应该执行的步骤?

这是我的uname输出(如果有用的话):

$uname -a
Linux ventana 3.14.48-1.0.x-ga+yocto+gd9991ca #1 SMP Wed Apr 18 15:23:20 MST 2018 armv7l GNU/Linux

答案1

一般来说,如果一个项目已经经历了几个主要版本,那么拥有一个裸的 是不明智的.so,因为主要版本的更改通常反映了不兼容的 ABI。只有版本化的库文件才能阻止程序“成功”链接,只会在更新符号链接时导致生成的程序以神秘的方式失败。 (Windows 也有类似的问题,旧的 DLL 通常不使用版本控制,并且安装程序经常用不兼容的版本替换它们,导致“DLL 地狱”。)

我会检查README(或等效)文件以查看要求是什么,然后运行configure --help以查看是否可以覆盖它所做的后备猜测;这还有利于将程序绑定到正确版本的库。

相关内容