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

Linking a shared library with another shared lib in linux

本文关键字:共享 另一个 链接 Linux      更新时间:2023-10-16

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

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

假设libabc.so是从与位置无关的目标代码文件中获取的,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

我在-l123之前添加了-L/usr/local/lib,因为我假设您有一个/usr/local/lib/lib123.so共享库。

另请阅读程序库操作方法。

如您所见,您可以将共享库lib123.so链接到您自己的共享库libabc.so

然后与ldd libabc.so核实

您可能希望通过在链接命令中添加-Wl,-rpath-Wl,$RPATHDIR来在libabc.so中设置一些 rpath。

有关更多详细信息,请阅读 Drepper 的论文如何编写共享库

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

当尝试创建我自己的使用 Berkeley DB 的共享库时,我发现我必须将 -ldb 放在 gcc 命令的末尾,否则它会爆炸说找不到符号"db_create"。 这是在西格温的领导下。

具体来说,这奏效了:

gcc -shared -o $b/$libfile nt_*.o -ldb

这不起作用:

gcc -ldb -shared -o $b/$libfile nt_*.o

遵循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)中进行了测试。