我可以通过链接静态库来构建共享库吗?

fly*_*bin 13 c c++ gcc shared-libraries static-libraries

我有一堆静态库(*.a),我想构建一个共享库(*.so)来链接这些静态库(*.a).我怎么能用gcc/g ++这样做?

R..*_*R.. 18

您可以(只提取所有.o文件并将它们链接起来-shared制作.so),但它是否有效以及它的工作原理取决于平台以及静态库是否编译为位置无关代码(PIC).在某些平台(例如x86_64)上,非PIC代码在共享库中无效且不起作用(实际上我认为链接器将拒绝生成.so).在其他平台上,非PIC代码将在共享库中工作,但是库的内存中副本在使用它的不同程序之间不可共享,甚至不能在同一程序的不同实例之间共享,因此会导致巨大的内存膨胀.

  • 感谢您提供这个非常有用的答案!我猜这是在x86_64上执行此错误的最佳解释:制作共享库时,不能使用针对“ g_gGlobalVariable”的'relocation R_X86_64_32S。用-fPIC重新编译 (2认同)

Joa*_*son 6

我不明白为什么你不能只是将动态库的文件构建到.o文件并链接;

gcc -shared *.o -lstaticlib1 -lstaticlib2 -o mylib.so
Run Code Online (Sandbox Code Playgroud)

  • @nos,PIC与可重定位不同.所有静态库都是可重定位的,但可能是也可能不是PIC.请注意,在x86 Linux(但不是x86-64)非PIC共享库_do_工作时,它们只需要在库加载时完成重定位,这很慢,增加了内存使用量,并且存在某些安全问题(因为它需要代码页在重定位过程中标记为r/w) (3认同)
  • 另请注意,如果同一个可执行文件中存在同一个静态库的多个实例(通过包含静态库的共享库间接加载),可能会发生奇怪的事情 (2认同)