最近,我一直在尝试编译和安装一个大型项目,陷入了嵌入式 Yocto Linux 项目的依赖地狱。我在安装依赖项时(通常在配置/制作/制作安装步骤期间)经常遇到找不到库的错误。我将快速查看一下/usr/lib
or /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
以查看是否可以覆盖它所做的后备猜测;这还有利于将程序绑定到正确版本的库。