如何管理共享库的开发和安装版本?

时间:2013-01-28 13:43:09

标签: linux shared-libraries

简而言之:这个问题主要是告诉Linux加载开发目录中可执行文件的.so文件的开发版本以及其他人安装的.so文件。

总之:想象一下共享库,我们称之为libasdf.so。想象一下以下目录:

/home/user/asdf/lib: libasdf.so
/home/user/asdf/test: ... perform_test
/opt/asdf/lib: libasdf.so
/home/user/jkl: ... use_asdf

换句话说,您有一个库的开发目录(/home/user/asdf),并且您已经安装了以前的稳定版本(/opt/asdf)以及其他一些使用它的程序({{1 }})。

我的问题是,如何告诉Linux,在执行/home/user/jkl时加载/home/user/asdf/lib/libasdf.so并在执行/home/user/asdf/test/perform_test时加载/opt/asdf/lib/libasdf.so?请注意,即使我在链接期间按/home/user/jkl/use_asdf指定目录,Linux也会使用其他方法(例如-L/ect/ld.so.conf)来查找$LD_LIBRARY_PATH文件。

我需要这样的事情的原因是,当然开发目录中的可执行文件需要链接到最新版本的库,而其他程序则希望使用稳定版本。

.so置于库路径中似乎不是一个安全的想法,更不用说不完全正确,因为您无法从其他目录运行测试。

我想到的一个解决方案是../libperform_test建立链接,安装后,将libasdf-dev.so复制为libasdf-dev.so并让其他人与之关联。这个解决方案有一个问题。想象一下以下附加目录:

libasdf.so

将其安装到:

/home/user/asdf/tool: ... use_asdf_too

在我的解决方案中,我们不知道应该将/opt/asdf/bin: use_asdf_too 链接起来。如果与use_asdf_too链接,如果从dev目录调用它将无法正常工作,如果与libasdf.so链接,则从安装位置调用它将无法正常工作。

我该怎么办?这是如何由其他人管理的?

1 个答案:

答案 0 :(得分:1)

安装的共享对象通常以“.so”结尾。通常他们还包括 soname ,例如libadsf.so.42.1。用于开发的.so文件通常是完全版本化文件名的符号链接。链接器将查找.so文件并将其解析为完整文件名,然后加载器将加载完全版本的库。