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

时间:2013-10-17 10:41:58

标签: c++ c linux linker shared-libraries

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

提前致谢。我正在使用g ++编译器

3 个答案:

答案 0 :(得分:20)

假设libabc.so来自posiition 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 :(得分:1)

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

具体来说,这有效:

  

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

这不起作用:

  

gcc -ldb -shared -o $ b / $ libfile nt _ * .o

答案 2 :(得分:0)

例如,按照Basile Starynkevitch所指出的相同过程,我有一个依赖于libm.so的库,因此库对象的编译是:

gcc -fPIC -Wall -g -I include -I src -c src/wavegen.c  -o build/arm/wavegen.o                                                                                          
gcc -fPIC -Wall -g -I include -I src -c src/serial.c  -o build/arm/serial.o

但是,要编译库,在某些版本的gcc中,库引用的放置顺序很重要,因此,为了确保兼容性,建议将这些引用放在命令末尾:

gcc -shared -Wl,-soname,libserial.so.1 -o lib/libserial.so.1.0 build/arm/wavegen.o build/arm/serial.o -lm

我已经在PC(gcc v.8.3.0)和ARM(gcc v.4.6.3)中进行了测试。