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

新手上路,请多包涵

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

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

原文由 A R 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 743
2 个回答

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

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

另请阅读 程序库 HowTo

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

然后检查 ldd libabc.so

您可能希望在 libabc.so 中设置一些 rpath ,方法是将 -Wl,-rpath-Wl,$RPATHDIR 添加到链接命令中。

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

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

原文由 Basile Starynkevitch 发布,翻译遵循 CC BY-SA 4.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) 中进行了测试。

原文由 Luighi Viton-Zorrilla 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题