我有一个第三方库,主要包含大量静态(.a
)库文件。我可以将它编译成单个.a
库文件,但我真的需要它是一个.so
共享库文件。
有没有办法将静态.a
文件转换为共享的.so
文件?或者更常见的是,有一种很好的方法可以将大量静态.a
文件与几个.o
目标文件合并到一个.so
文件中?
答案 0 :(得分:40)
这是否(当然是适当的-L)
gcc -shared -o megalib.so foo.o bar.o -la_static_lib -lb_static_lib
不行吗?
答案 1 :(得分:22)
如果静态库中的对象是在没有-fPIC或类似的情况下编译的,则无法执行此操作。
答案 2 :(得分:15)
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
我不确定gcc,但对于g ++,我必须添加--whole-archive链接器选项,以包含共享对象中静态库中的对象。 如果要链接到libc_static_lib.a和libother_shared_object.so,则必须使用--no-whole-archive选项,但不要将它们作为整体包含在megalib.so中。
答案 3 :(得分:9)
ar -x lib***.a
gcc -shared *.o -o lib***.so
答案 4 :(得分:2)
ar -x
中的特定对象并且您不想自己添加任何内容,那么 .a
也很有用。
示例:
ar -x lib***.a
gcc -shared *.o -o lib***.so