简而言之:这个问题主要是告诉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
置于库路径中似乎不是一个安全的想法,更不用说不完全正确,因为您无法从其他目录运行测试。
我想到的一个解决方案是../lib
与perform_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
链接,则从安装位置调用它将无法正常工作。
我该怎么办?这是如何由其他人管理的?
答案 0 :(得分:1)
安装的共享对象通常只以“.so”结尾。通常他们还包括 soname ,例如libadsf.so.42.1
。用于开发的.so文件通常是完全版本化文件名的符号链接。链接器将查找.so文件并将其解析为完整文件名,然后加载器将加载完全版本的库。