我将用一个简化的例子来解释我的情况。
我有两个 libme.so文件,它们具有不同的实现,我已经验证它们可以同时在单个设计中工作。一个位于./root/v1/,另一个位于./root/v2 /
我的“main”.so文件与这两个libme.so文件链接,位于./root/libtest.so
现在我有要求让事情可以重新定位。也就是说,如果我将整个“根”目录复制到另一个位置甚至是另一台机器(假设二进制兼容),那么事情应该仍然可以正常工作。
我的问题是,为了使这项工作,我应该使用什么gcc命令行来构建libtest.so?
我尝试了以下两个:
(1)(假设我在“root”目录中)
>gcc -shared -o libtest.so ./v1/libme.so ./v2/libme.so
这将使libtest.so具有绝对路径的那两个链接依赖项。这可以通过ldd:
验证>ldd libtest.so
/home/design/root/v1/libme.so
/home/design/root/v2/libme.so
显然路径是固定的。因此,一旦我重新定位“root”目录,它就无法在运行时找到libme.so。注意设置LD_LIBRARY_PATH在这种情况下不起作用,因为来自ldd的路径是绝对路径。 runtimer加载程序不会搜索LD_LIBRARY_PATH来查找libme.so。
(2)
>gcc -shared -o libtest.so -lme -L./v1 -L./v2
只有我们有一个版本的libme.so时,这才有效。在这种情况下,./v2中的版本不会被链接。-rpath也存在同样的问题。
鉴于此,我还有其他选择吗?
注意有一些限制: (1)不能将libme.so重命名为libme_v1.so等其他名称 (2)libtest.so必须链接两个版本的libme.so
答案 0 :(得分:0)
Teppic是对的。事实证明这只是我的一台机器上发生的问题。切换到另一台RHEL5.8机器,我已经完成了设置。看起来原始机器安装了由某人定制的链接器。