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

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

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

  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • Locale.getDefault() 始终返回 en

    unix 机器上的服务器始终使用 en 作为默认区域设置 以下是区域设置输出 LANG en US LC CTYPE C LC NUMERIC C LC TIME C LC COLLATE C LC MONETARY C LC MESSAG
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • 在 Linux 上更快地分叉大型进程?

    在现代 Linux 上达到与 Linux 相同效果的最快 最好的方法是什么 fork execve combo 从一个大的过程 我的问题是进程分叉大约 500MByte 大 并且一个简单的基准测试只能从进程中实现约 50 个分叉 秒 比较最
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • 如何使用 xterm.js 创建基于 Web 的终端以 ssh 进入本地网络上的系统

    我偶然发现了这个很棒的图书馆xterm js https xtermjs org 这也是 Visual Studio Code 终端的基础 我有一个非常普遍的问题 我想通过基于网络的终端 不在网络中 可能位于 aws 服务器上 访问本地网络
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • 在 Visual Studio 2012 中安装 OpenCV

    我正在尝试安装 OpenCV 来与 Visual Studio 一起使用 我使用的是2012Pro版本 但我认为它应该与vs10相同 我正在关注这个教程 http docs opencv org doc tutorials introduc
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific

随机推荐