将静态库转换为共享库?

Eli*_*ght 50 c linux shared-libraries static-libraries

我有一个第三方库,主要包含大量的static(.a)库文件.我可以将它编译成单个.a库文件,但我真的需要它作为单个.so共享库文件.

有没有办法将静态.a文件转换为共享.so文件?或者更一般地说,有一种很好的方法可以将大量静态.a文件与一些.o目标文件合并到一个.so文件中?

dic*_*oce 42

这个(当然是适当的-L)

gcc -shared -o megalib.so foo.o bar.o -la_static_lib -lb_static_lib
Run Code Online (Sandbox Code Playgroud)

不行吗?

  • 使用gcc -shared完成了这个技巧,但只有在我用-fPIC重新编译之后.谢谢你指点我正确的方向! (5认同)

vit*_*.ch 24

如果静态库中的对象是在没有-fPIC或类似的情况下编译的,则无法执行此操作.

  • 缺少-fPIC或类似情况会导致SegFault (4认同)
  • 在支持良好的目标上,"PIC"对于共享库代码不是必需的.它只会导致更高效的内存使用(大部分,而不是少数几个页面可以共享),但会牺牲一些性能. (3认同)

小智 17

g++ -shared -o megalib.so foo.o bar.o -Wl,--whole-archive -la_static_lib -lb_static_lib -Wl,--no-whole-archive -lc_static_lib -lother_shared_object
Run Code Online (Sandbox Code Playgroud)

我不确定gcc,但对于g ++,我必须添加--whole-archive链接器选项,以包含共享对象中静态库中的对象.如果要链接到libc_static_lib.a和libother_shared_object.so,则必须使用--no-whole-archive选项,但不要在megalib.so中将它们作为一个整体包含在内.

  • 在命令行的末尾需要`-Wl - no-whole-archive`.请参阅[问题编辑,此处](http://stackoverflow.com/questions/7935421/linking-archives-a-into-shared-object-so). (3认同)

小智 7

ar -x lib***.a
gcc -shared *.o -o lib***.so
Run Code Online (Sandbox Code Playgroud)


Ana*_*dis 6

ar -x如果您想专注于.as中的特定对象并且不想自己添加任何内容,它也很有用。

例子:

ar -x lib***.a
gcc -shared *.o -o lib***.so
Run Code Online (Sandbox Code Playgroud)