如何重命名共享库以避免同名冲突?

乔治·希利亚德

我找到了一个库,libjson试图将其构建为共享库并在项目中使用。建筑很简单;修复Makefile错误后,

# SHARED=1 make install

将编译并安装.soin /usr/lib问题是我的系统(Arch Linux)已经有一个名为的库libjson,Makefile为我覆盖了它!Arch的库已作为依赖项安装,因此无法替换。如果其他发行版有一个名为的库,则大概也会遇到类似的问题libjson

我该怎么办?我可以重命名库(libjson-mine或其他东西),但是动态链接离魔术只有几步之遥,所以我不知道这是否会破坏某些东西。如何重命名库?

另一个选择是将库的源代码放入我当前项目的源树中,然后让构建器创建一个静态库。(显然,这会使我的代码存储库有点混乱,因此是不合需要的。)如果我走了这条路线,则需要使链接程序更喜欢我的链接器,libjson.a而不是搜索/usr/lib“合适的”(读:错误的)库。如何使链接器首选我的版本?

或者,还有我不知道的第三种选择吗?

西罗·桑蒂利(Ciro Santilli)TRUMP BAN IS BAD

背景概念

共享库有两个使用点:

  • 链接器的编译(ld
  • 由动态加载程序执行
  1. 如果您在gcc中使用进行编译-llibjson,则基本名称将存储在可执行文件中

    在执行时,将在标准路径中搜索该基名。

    在链接时,链接器必须能够在其搜索路径上找到您的库。前置搜索路径并不容易

    您也许可以摆脱/usr/local/lib针对用户编译库的需求,并且应该早于此/usr/lib

    但是这样做会破坏使用其他方法的任何东西libjson,因此您可能不希望这样做。

  2. 如果在gcc中用-l:/full/path/to/libjson.so完整路径进行编译,则会将其存储在可执行文件中。

    执行时,不需要路径搜索,因为我们已经有了完整的路径。

您可以使用以下命令检查存储在可执行文件中的文件:

readelf -d a.out | grep 'Shared library'

可能的解决方案

我看不到任何不需要编辑Makefile项目的好的解决方案,因此详细信息是特定于项目的。但总的来说,您可以:

  1. 编辑该库的Makefile或类似文件,然后将基本名称重命名为libjson_mine.so

    使用以下命令编译需要该库的程序-ljson_mine这将起作用,因为我们知道该路径/usr/lib.so搜索路径中。

    这是最好的选择,迟早要这样做,否则将导致无休止的混乱……发送请求请求!

    在相同的拉取请求中,还将默认安装目录更改/usr/local/lib/usr/lib这是理智的用户编译库在默认情况下必须存在的位置,正是为了避免覆盖分发的库。

  2. 如果所有者不想重命名该库,请在Makefile中找到一个选项来更改生成的库的基本名称。

    如果该选项不存在,请拉取请求。如果所有者不想接受,则分叉项目;-)

    然后,您和您的发行版可以在编译时使用该选项。

  3. 在Makefile中找到一个选项,该选项会更改安装了库+标头的目录,然后使用完全自定义的(~/usr/lib~usr/include),然后将其添加到动态加载程序搜索路径中。如何指定库路径的首选项?+包括搜索路径。有关GNU方法,请参见make的DESTDIR和PREFIX

    然后在编译/执行时,更改包含/动态加载程序的搜索路径。

    并不理想,但可以一次性使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何重命名共享库以避免同名冲突?

来自分类Dev

如何重命名文件名以避免在Windows或Mac中发生冲突?

来自分类Dev

如何重命名文件名以避免在Windows或Mac中发生冲突?

来自分类Dev

如何在Redis上命名空间键以避免名称冲突?

来自分类Dev

触发以避免冲突

来自分类Dev

如何制作针对自己的JS函数以避免冲突

来自分类Dev

如何生成自定义 JSESSIONID 以避免冲突

来自分类Dev

如何恢复通过在 phpmyadmin 中重命名为同名不同大小写而删除的 MariaDB 数据库

来自分类Dev

如何重命名与父文件夹同名的文件

来自分类Dev

重命名同名目录时如何使 mv 忽略

来自分类Dev

如何重命名本地 APT 存储库?

来自分类Dev

长时间运行的查询加上MySQL中的重命名表争用使数据库瘫痪。如何避免?

来自分类Dev

如何构造数据库以避免表中重复

来自分类Dev

如何避免重命名Oledbconnection数据源

来自分类Dev

如何避免或重命名jaxb中的key和entry标签?

来自分类Dev

有没有一种方法可以给HTML输入一些命名空间以避免冲突?

来自分类Dev

如何在此哈希函数中使用链接列表实现以避免冲突?

来自分类Dev

如何正确配置ODataModelBuilder以避免与模型对象的虚拟属性冲突

来自分类Dev

如何编写支票以避免出现“INSERT 语句与 FOREIGN KEY 约束冲突”的消息?

来自分类Dev

如何避免C库中的函数名冲突?

来自分类Dev

如何一次重命名具有不同名称的多个文件?

来自分类Dev

如何重命名具有相同名称的列以使其不同?

来自分类Dev

如何重构以避免重复?

来自分类Dev

如何在RethinkDB中重命名数据库

来自分类Dev

重命名后如何查找存储库的新位置

来自分类Dev

如何在elasticsearch中重命名快照存储库?

来自分类Dev

如何在Xamarin绑定库中重命名属性

来自分类Dev

git冲突重命名/大量文件更改

来自分类Dev

为什么我不能在构建后重命名共享库?

Related 相关文章

  1. 1

    如何重命名共享库以避免同名冲突?

  2. 2

    如何重命名文件名以避免在Windows或Mac中发生冲突?

  3. 3

    如何重命名文件名以避免在Windows或Mac中发生冲突?

  4. 4

    如何在Redis上命名空间键以避免名称冲突?

  5. 5

    触发以避免冲突

  6. 6

    如何制作针对自己的JS函数以避免冲突

  7. 7

    如何生成自定义 JSESSIONID 以避免冲突

  8. 8

    如何恢复通过在 phpmyadmin 中重命名为同名不同大小写而删除的 MariaDB 数据库

  9. 9

    如何重命名与父文件夹同名的文件

  10. 10

    重命名同名目录时如何使 mv 忽略

  11. 11

    如何重命名本地 APT 存储库?

  12. 12

    长时间运行的查询加上MySQL中的重命名表争用使数据库瘫痪。如何避免?

  13. 13

    如何构造数据库以避免表中重复

  14. 14

    如何避免重命名Oledbconnection数据源

  15. 15

    如何避免或重命名jaxb中的key和entry标签?

  16. 16

    有没有一种方法可以给HTML输入一些命名空间以避免冲突?

  17. 17

    如何在此哈希函数中使用链接列表实现以避免冲突?

  18. 18

    如何正确配置ODataModelBuilder以避免与模型对象的虚拟属性冲突

  19. 19

    如何编写支票以避免出现“INSERT 语句与 FOREIGN KEY 约束冲突”的消息?

  20. 20

    如何避免C库中的函数名冲突?

  21. 21

    如何一次重命名具有不同名称的多个文件?

  22. 22

    如何重命名具有相同名称的列以使其不同?

  23. 23

    如何重构以避免重复?

  24. 24

    如何在RethinkDB中重命名数据库

  25. 25

    重命名后如何查找存储库的新位置

  26. 26

    如何在elasticsearch中重命名快照存储库?

  27. 27

    如何在Xamarin绑定库中重命名属性

  28. 28

    git冲突重命名/大量文件更改

  29. 29

    为什么我不能在构建后重命名共享库?

热门标签

归档