简而言之:这个问题基本上是告诉Linux在dev目录中加载可执行文件的开发版本,在其他目录中加载已安装的文件。
在long中:想象一个共享库,我们称它为.so
。想象一下下面的目录:
/home/user/asdf/lib: libasdf.so
/home/user/asdf/test: ... perform_test
/opt/asdf/lib: libasdf.so
/home/user/jkl: ... use_asdf
换言之,您的库(
.so
)有一个开发目录,并且您已经安装了它以前稳定版本(libasdf.so
)的副本以及使用它的其他一些程序(/home/user/asdf
)。我的问题是,如何告诉Linux,在执行
/opt/asdf
时加载/home/user/jkl
,在执行/home/user/asdf/lib/libasdf.so
时加载/home/user/asdf/test/perform_test
注意,即使我在链接期间通过/opt/asdf/lib/libasdf.so
指定目录,Linux也使用其他方法(例如/home/user/jkl/use_asdf
和-L
)来查找/ect/ld.so.conf
文件。我需要这样一个东西的原因是,当然,开发目录中的可执行文件需要链接到库的最新版本,而其他程序则希望使用稳定版本。
在库路径中放置
$LD_LIBRARY_PATH
似乎不是一个安全的想法,更不用说不完全正确,因为您不能从其他目录运行测试。我考虑的一个解决方案是让
.so
链接到../lib
,在安装时,将perform_test
复制为libasdf-dev.so
,并让其他人链接到该链接。不过,这个解决方案有一个问题。想象一下下面的附加目录:/home/user/asdf/tool: ... use_asdf_too
安装到:
/opt/asdf/bin: use_asdf_too
在我的解决方案中,不知道
libasdf-dev.so
应该与什么相关联。如果链接到libasdf.so
,如果从dev目录调用它,它将无法正常工作;如果链接到use_asdf_too
,如果从安装位置调用它,它将无法正常工作。我能做什么?这是怎么被别人管理的?
最佳答案
安装的共享对象通常不仅仅以“.so”结尾。通常他们也包括他们的奏鸣曲,如libadsf.so.42.1
。用于开发的.so文件通常是指向完全版本化文件名的符号链接。链接器将查找.so文件并将其解析为完整的文件名,然后加载程序将加载完全版本化的库。
关于linux - 如何管理共享库的开发和安装版本?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14563360/