链接共享库与Linux中的另一个共享库

问题描述:

我想构建一个共享库。让我们说libabc.so。它使用另一个.so文件,比如说lib123.so(在/ usr/local/lib中的一个lib)。现在我在我的应用程序中使用我的共享库libabc.so。说我的应用程序。我想知道我应该如何链接这些二进制文件??我不想直接链接我的应用程序与lib123.so。我的应用程序应该只与libabc.so链接。我怎样才能做到这一点?链接共享库与Linux中的另一个共享库

在此先感谢。我正在使用g ++编译器

+0

你有没有想过使用一个atuomated构建系统,fo例如autotools? autotools自带libtool,它将构建共享库所需的大部分尴尬处理都带走了。 –

+0

@nyarlathotep:你建议与静态链接'lib122.a'共享'libabc.so' –

+0

显示确切的构建命令(对于目标文件和共享库)是错误的。 –

假设libabc.soposiition independent获得目标代码文件abc1.pic.oabc2.pic.o;那么你已经用例如

gcc -Wall -fPIC -O -g abc1.c -c -o abc1.pic.o 
gcc -Wall -fPIC -O -g abc2.c -c -o abc2.pic.o 

与您共建libabc.so

gcc -shared abc1.pic.o abc2.pic.o -L/usr/local/lib -l123 -o libabc.so 

我加-L/usr/local/lib-l123因为我假设你有一个/usr/local/lib/lib123.so共享库。

又读Program Library HowTo

正如你看到的,你可以链接共享库lib123.so到自己的共享库libabc.so

然后用ldd libabc.so

PS检查。不要使用静态库lib123.a(它应该是PIC)。如果将非PIC代码链接到共享对象中,则会丧失共享对象的大部分优点,并且动态链接程序ld.so必须执行无数次重定位。

+1

我已经完成了你在这里提到的完全一样的东西。但是当我在libabc.so上执行ldd时,它并没有列出lib123.so。你知道这是为什么吗? –

+0

为什么不用lib123的静态库?如果它不是PIC? –

+1

我忍不住了,除非你**至少展示了**精确的命令**,涉及构建你的'abc * .pic.o'对象和'libabc.so'库。 –

当试图创建我自己的使用Berkeley DB的共享库时,我发现我必须将-ldb放在gcc命令的末尾,否则它会爆发说未找到符号'db_create'。这是在Cygwin之下。

具体来说,这个工作:

的gcc -o -shared $ B/$ LIBFILE NT _ *Ø-ldb

这不起作用:

GCC - ldb -shared -o $ b/$ libfile nt _ *。