2013-03-28 103 views
3

我会用一个简单的例子来解释我的情况。gcc中的相对路径链接

我有两个 libme.so文件有不同的实现,我已经验证他们可以同时在一个设计中工作。一个位于./root/v1/,另一个位于./root/v2/

我的“main”.so文件与这两个libme.so文件相链接,位于./root /libtest.so

现在我有要求重新定位的要求。也就是说,如果我将整个“根”目录复制到另一个位置或甚至另一台计算机(假设二进制兼容),事情应该仍然可以正常工作。

我的问题是,为了使这项工作,我应该用什么gcc命令行来构建libtest.so?

我试过有以下两种:

(1)(假设我在 “根” 目录)

>gcc -shared -o libtest.so ./v1/libme.so ./v2/libme.so 

这将使libtest.so同时具有与2点链接的依赖绝对路径。这可以通过ldd验证:

>ldd libtest.so 
/home/design/root/v1/libme.so 
/home/design/root/v2/libme.so 

显然路径是固定的。所以一旦我重新定位了“根”目录,它在运行时就找不到libme.so。注意,在这种情况下,LD_LIBRARY_PATH不起作用,因为ldd的路径是绝对路径。运行器加载器不会搜索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

这是哪个操作系统?用Linux(至少是我使用的链接器)与相对路径链接是好的 – teppic

+0

它是Linux,rhel 5/6。如果你像(1)一样执行相同的gcc命令,你会从ldd获得相同的样式输出吗?如果不是,你能告诉我你的gcc命令和ldd的输出吗?谢谢。 – michael6866

+0

也许这是链接器版本?我正在使用最新的Ubuntu。当我链接到上面的目录时,ldd给了我'../liba.so.1.0(0x00007f39c0226000)' – teppic

回答

0

Teppic的是链接对。这原来只是我的一台机器上发生的问题。切换到另一台RHEL5.8机器,我都准备好了。它看起来像原来的机器安装了一个由某人定制的链接器。