【发布时间】:2013-11-13 10:12:11
【问题描述】:
我找到了一个库 libjson,我正在尝试将其构建为共享库并在项目中使用。建筑很简单;修复 Makefile 错误后,
# SHARED=1 make install
将在/usr/lib 中编译和安装.so。问题是我的系统(Arch Linux)已经有一个名为libjson 的库,Makefile 不假思索地为我覆盖了它! Arch 的库是作为依赖项安装的,因此无法替换。如果其他发行版有一个名为 libjson 的库,可能会遇到类似的问题。
对此我能做些什么?我可以重命名库(libjson-mine 或其他名称),但动态链接距离魔术只有几步之遥,所以我不知道这是否会破坏某些东西。 如何重命名库?
另一种选择是将库的源代码放入我当前项目的源代码树中,并让构建器创建一个静态库。 (显然这使我的代码存储库有点混乱,因此不受欢迎。)如果我走这条路,我需要让链接器更喜欢我的libjson.a,而不是在/usr/lib 中搜索“合适的”(阅读:错误) 图书馆。 如何让链接器更喜欢我的版本?
或者,有没有我不知道的第三种选择?
【问题讨论】:
-
一个更好的主意是使用通常的
/usr/local/前缀配置和安装您在软件包系统之外显式构建的软件,以便您的libjson进入/usr/local/lib/libjson.so;此外,了解有关LD_LIBRARY_PATH环境变量和/etc/ld.so.conf以及ldconfig命令的更多信息。
标签: linux linker shared-libraries dynamic-linking file-rename