c++ - 在linux中将共享库与另一个共享库链接

标签 c++ c linux linker shared-libraries

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

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

最佳答案

假设 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 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/

相关文章:

c++ - '+=' : pointer on left; needs integral value on right

c++ - 如何编写一个灵活的模块化程序,模块之间具有良好的交互可能性?

c - 关于qpid交换,队列

c - 从虚拟路径启动应用程序时如何防止 SxS 错误?

linux - 如何使用 vi 在 Linux 的终端中编辑命令?

c++ - 复合表达式与表达式与子表达式

c++ - 一个处理 char* 和 wchar_t* 的函数

c - 如果我们同时初始化 union 体的所有成员会发生什么?

linux - 为什么运行多个相同的命令需要很长时间

linux - 多个批量 URB 接收数据到 USB LINUX 中的特定 URB