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

2024-05-06

我找到了一个图书馆,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一个“合适的”(读作:错误的)库。如何使链接器更喜欢我的版本?

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


背景概念

共享库在两个点上使用:

  • 由链接器编译(ld)
  • 由动态加载器执行
  1. 如果你在 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,所以你可能不希望这样。

  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 中找到一个选项来更改生成的库的基本名称。

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.
  1. 在 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(使用前将#替换为@)

如何重命名共享库以避免同名冲突? 的相关文章

  • 通过文件上传控件上传文件时重命名c#.net中的文件并将文件的更改名称保存在数据库中

    我有文件上传器 通过它浏览文件 并将浏览文件的名称存储在字符串变量中 现在我想用存储在另一个字符串变量中的另一个名称重命名这个uplaod文件名 string strRoleValue ddlrole SelectedValue strin
  • 无法连接到 Azure Ubuntu VM - 公钥被拒绝

    我们在 Azure 上使用 Ubuntu VM 一段时间了 很少遇到任何问题 然而 其中一台虚拟机最近出现了问题 出乎意料的是 Ubuntu VM 开始拒绝公钥 ssh i azure key email protected cdn cgi
  • 如何在 Linux 中向热敏打印机发送 ESC/POS 命令

    我正在尝试在热敏打印机上发送 ESC POS 命令 但每当我发送它们时 热敏打印机都会将它们打印为文本 而不是作为命令执行它们 我在 prn 文件中编写这些命令 每当我执行 lp 命令来打印文件时 这些 prn 文件也会被打印 但作为文本
  • 有没有办法提高linux管道的性能?

    我正在尝试使用 64 位将超高速数据从一个应用程序传输到另一个应用程序CentOS http en wikipedia org wiki CentOS6 我使用以下方法进行了基准测试dd发现阻碍我的是管道而不是程序中的算法 我的目标是达到
  • GCC 详细模式输出解释

    我是 Linux 新手 谁能向我解释一下我的 hello world 程序的以下详细模式输出 另外 这些文件是做什么用的crt1 o crti o crtend o crtbegin o and crtn o and lc and lgcc
  • 用于 e NetworkManager VPN 连接的 dbus 信号处理程序

    我需要开发一些在建立 VPN 连接时执行的 python 代码 VPN 由 NetworkManager 控制 我试图弄清楚如何为此使用 NM DBUS 事件 使用 dbus monitor system 我能够识别连接信号 signal
  • EULA 接受 Bash 脚本

    我有一个尝试安装垃圾箱的脚本 除了 bin 在 more 中打开 EULA 之外 一切正常 在脚本再次开始并自行完成安装之前 您必须手动 ctrl c 退出此 more 实例 因为这更多的是逃离 shell 所以脚本在打开后不知道要运行什么
  • 在 Linux 服务器上创建和编辑 MS-Word 文档?

    希望开发处理文档的服务器端应用程序 源文档大多是MS Word 2003 2007 即MS版本的Docx 希望服务器应用程序能够在linux或windows上运行 想知道在linux下读写MS Word文件最好的工具或库是什么 兼容性是最重
  • 使用 .htaccess 启用 PHP 短标签

    我在自己的 Centos 服务器上设置了 Apache 并具有多个虚拟 Web 服务器 并且我希望仅为位于以下位置的其中一个 Web 服务器启用 PHP 短标记 var www ostickets html 我可以通过添加成功启用短标签sh
  • 在 Windows / Linux 中创建 Mac 包

    我自己努力制作一个 r 包 我按照 stackoverflow 中上一个问题的说明进行操作如何为外行开发软件包 http cran r project org bin windows Rtools 以下是我根据上一个问题采取的步骤 在新的
  • 如何在C程序中直接改变显存映射来绘制像素(无需库函数)

    是否可以通过使用 C 程序更改 RAM 中屏幕 视频即监视器 内存映射中的值来显示黑点 我不想使用任何库函数 因为我的主要目标是学习如何开发简单的操作系统 我尝试访问起始屏幕内存映射 即 0xA0000 在 C 中 我尝试运行该程序 但由于
  • 使用 Vala 和 GLib 的正则表达式

    有没有一个函数 比如http php net manual en function preg match all php http php net manual en function preg match all php 使用 GLibh
  • Flex 的远程版本误解了我的规则

    我使用 flex 和 bison 编写了一个小汇编程序 可以在我的机器 ubuntu 10 10 上构建并运行正常 现在其他人正在尝试在 arch linux 上构建它 并且他们安装的 flex 产生了不同的 lex yy c 这是不匹配的
  • “./somescript.sh”和“. ./somescript.sh”有什么区别

    今天我按照一些说明在 Linux 中安装软件 有一个需要首先运行的脚本 它设置一些环境变量 指令告诉我执行 setup sh 但是我执行时犯了一个错误 setup sh 所以环境没有设置 最后我注意到了这一点并继续进行 我想知道这两种调用脚
  • 使用 hcitool 扫描低功耗蓝牙?

    当我运行此命令时 BLE 设备扫描仅持续 5 秒 sudo timeout 5s hcitool i hci0 lescan 输出显示在终端屏幕中 但是 当我将输出重定向到文件以保存广告设备的地址时 每次运行该命令时 我都会发现该文件是空的
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • 路由是否会影响具有绑定源地址的套接字?

    假设我有两个网络接口 eth0有地址10 0 0 1 eth1有地址192 168 0 1 Using route or ip route add我已将其设置为路由 所有地址至eth0 1 2 3 4只为了eth1 所以数据包到1 2 3
  • VSCODE 在 Linux 上不适用于我

    刚刚了解 VSCODE 很高兴尝试一下 我下载 解压并运行可执行文件 我得到 Code 2183 0429 201254 ERROR browser main loop cc 170 Running without the SUID san
  • 如何获取 bash 中从 Ping 接收到的数据包的百分比?

    当 ping 主机时 我希望输出仅显示收到的数据包 已发送 5 个 的百分比 我想我需要使用grep不知怎的 但我不知道如何 我是 bash 编程的新手 这是我所在的地方 ping c 5 q host grep grep 中应该包含什么

随机推荐