我正在尝试构建一个共享库。让我们说libabc.so
。它使用另一个 .so
文件,例如 lib123.so
(/usr/local/lib
中的一个库)。现在我在我的应用程序中使用我的共享库 libabc.so
。说 my-app
。我想知道我应该如何链接这些二进制文件?我不想将 my-app
与 lib123.so
直接链接。 my-app
应该只与 libabc.so
链接。我该怎么做?
提前致谢。我正在使用 g++
编译器。
最佳答案
假设 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
before -l123
因为我假设你有一个 /usr/local/lib/lib123.so
共享库。
另请阅读 Program Library HowTo .
如您所见,您可以将共享库 lib123.so
链接到您自己的共享库 libabc.so
然后检查 ldd libabc.so
您可能需要设置一些 rpath通过在链接命令中添加 -Wl,-rpath
和 -Wl,$RPATHDIR
在您的 libabc.so
中。
有关更多详细信息,请阅读 Drepper 的论文 How to write shared libraries
PS。不要为 lib123.a
使用静态库(它应该是 PIC)。如果您将非 PIC 代码链接到共享对象,您将失去共享对象的大部分优势,并且动态链接器 ld.so必须进行无数次搬迁。
关于c++ - 在linux中将共享库与另一个共享库链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19424494/