安装共享库的多个版本

安装共享库的多个版本

我正在运行 ubuntu 10.04 并且我想使用 tmux 1.6。tmux 依赖于 libevent 2。

我的解决方案是编译 libevent2 并放入,/usr/local/lib然后针对此库编译 tmux 并放入/usr/local/bin。这很有效,直到...我重新启动。这只是我的一个假设,但似乎其他二进制文件现在链接到 libevent2 库,大概是因为它在库路径上。因为有 60 多个软件包具有 libevent1 依赖项,这导致我的安装基本上失去了意义。

是否有一种惯用的方式来运行对不同版本具有核心库依赖性的应用程序?我应该静态链接库吗?

答案1

http://www.ibm.com/developerworks/linux/library/l-lpic1-v3-102-3/建议

加载特定库

如果您正在运行需要特定旧版本共享库的旧应用程序,或者您正在开发新的共享库或共享库的新版本,则可能需要覆盖加载器使用的默认搜索路径。使用可能安装在 /opt 树中的产品特定共享库的脚本可能也需要这样做。就像您可以设置 PATH 变量来指定可执行文件的搜索路径一样,您可以将 LD_LIBRARY_PATH 变量设置为以冒号分隔的目录列表,这些目录应在 ld.so.cache 中指定的系统目录之前搜索共享库。例如,您可以使用以下命令:

export LD_LIBRARY_PATH=/usr/lib/oldstuff:/opt/IBM/AgentController/lib

链接的文章说明了如何使用 ldd 找出程序所依赖的库。

答案2

编译后的二进制程序通常链接到 /usr/lib/libXXX.so.1.2.3

如果您使用特定的新版本,您可以将其放入其中/usr/lib/libXXX.so.3.4.5 ,并且您新创建的程序应该与此链接。

您实际上可以通过以下方式检查旧程序是否链接到新的库 ldd /path/to/program

如果确实发生这种情况,您可以:

  • 将新的库放入单独的目录中/special/path/lib,然后
  • 使用包装器 shell 脚本启动你的特殊程序,该脚本设置 LD_LIBRARY_PATH=/special/path/lib:$LD_LIBRARY_PATH 并启动二进制文件或
  • 如果你自己编译程序,你可能会传递LDFLAGS=-Wl,-rpath,/special/path/lib,这会将特殊库的搜索路径硬编码到你的程序中(很好,因为不需要包装脚本就可以工作)

相关内容