链接gcc中的相对路径

时间:2013-03-28 15:54:12

标签: gcc linker

我将用一个简化的例子来解释我的情况。

我有两个 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

1 个答案:

答案 0 :(得分:0)

Teppic是对的。事实证明这只是我的一台机器上发生的问题。切换到另一台RHEL5.8机器,我已经完成了设置。看起来原始机器安装了由某人定制的链接器。