我找到了一个图书馆,libjson http://sourceforge.net/projects/libjson/,我正在尝试将其构建为共享库并在项目中使用。建造很简单;修复 Makefile 错误后,
# SHARED=1 make install
将编译并安装一个.so
in /usr/lib
。问题是我的系统(Arch Linux)已经有一个名为的库libjson
,Makefile 不假思索地为我覆盖了它! Arch 的库是作为依赖项安装的,因此无法替换。想必其他发行版如果有一个名为的库也会有类似的问题libjson
.
对此我能做什么?我可以重命名该库(libjson-mine
或其他),但动态链接离魔法只有几步之遥,所以我不知道这是否会破坏某些东西。如何重命名库?
另一种选择是将库的源代码放入我当前项目的源代码树中,并让构建器创建一个静态库。 (显然,这使我的代码存储库有点混乱,因此是不可取的。)如果我走这条路,我需要使链接器更喜欢我的libjson.a
而不是搜索/usr/lib
一个“合适的”(读作:错误的)库。如何使链接器更喜欢我的版本?
或者,还有我不知道的第三种选择吗?
背景概念
共享库在两个点上使用:
-
如果你在 gcc 中编译-ljson
,基本名称将存储在可执行文件中
在执行时,将搜索标准路径以查找该基本名称。
在链接时,链接器必须能够在其搜索路径上找到您的库。这并不容易prepend到搜索路径:
- GCC如何在默认链接器默认搜索路径之前添加? LIBRARY_PATH 不起作用 https://stackoverflow.com/questions/15836423/gcc-how-to-add-before-the-default-linker-search-path-by-default-library-path-no
- 如何阻止 gcc 将 -L 和标准库路径传递给链接器 https://stackoverflow.com/questions/4480112/how-to-stop-gcc-from-passing-l-with-standard-library-paths-to-the-linker
你也许可以逃脱/usr/local/lib
它适用于用户编译的库,应该位于之前/usr/lib
.
但这样做会破坏任何使用另一个的东西libjson
,所以你可能不希望这样。
-
如果你在 gcc 中编译-l:/full/path/to/libjson.so
完整路径将存储在可执行文件中。
执行时,不需要搜索路径,因为我们已经有了完整路径。
您可以使用以下命令检查可执行文件中存储的内容:
readelf -d a.out | grep 'Shared library'
可能的解决方案
我没有看到任何不需要编辑的好的解决方案Makefile
项目的细节,因此细节是项目特定的。但一般而言,您可以:
-
编辑库的 Makefile 或类似文件,并将基本名称重命名为libjson_mine.so
.
使用以下命令编译需要该库的程序:-ljson_mine
。这会起作用,因为我们知道/usr/lib
在里面.so
搜索路径。
这是最好的选择,迟早必须完成,否则它将成为无尽混乱的根源......发送拉取请求!
在同一个拉取请求中,还将默认安装目录更改为/usr/local/lib
代替/usr/lib
。这就是默认情况下理智的用户编译库必须去的地方,以避免覆盖发行版提供的库。
-
如果所有者不想重命名库,请在 Makefile 中找到一个选项来更改生成的库的基本名称。
If such option does not exist, pull request. If the owner does not want to accept that, fork the project ;-)
Then you and your distribution can use that option when compiling.
-
在 Makefile 中找到一个选项来更改库 + 头文件的安装目录,然后使用完全自定义的内容(~/usr/lib
, ~usr/include
),并将其添加到动态加载程序搜索路径中如何指定库路径的首选项? https://stackoverflow.com/questions/2726993/g-how-to-specify-preference-of-library-path+ 包含搜索路径。看make 的 DESTDIR 和 PREFIX https://stackoverflow.com/questions/11307465/destdir-and-prefix-of-make对于 GNU 方法。
然后在编译/执行时,更改包含/动态加载器搜索路径。
不太理想,但可能一次性有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)