我正在尝试构建一个共享库。让我们说libabc.so。它使用另一个.so文件,比如lib123.so(/ usr / local / lib中的lib)。现在我在我的应用程序中使用我的共享库libabc.so。说我的应用程序。我想知道我应该如何链接这些二进制文件?我不想直接将我的应用程序与lib123.so链接。 my-app应该只与libabc.so链接。我怎么能这样做?
提前致谢。我正在使用g ++编译器
答案 0 :(得分:20)
假设libabc.so
来自posiition independent目标代码文件abc1.pic.o
和abc2.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
共享库。
如您所见,您可以将共享库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)中进行了测试。