64

我有一个第三方库,主要由大量静态(.a)库文件组成。我可以把它编译成一个单一的.a库文件,但我真的需要它是一个单一的.so共享库文件。

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

4

5 回答 5

55

这样做(当然有适当的-L)

gcc -shared -o megalib.so foo.o bar.o -la_static_lib -lb_static_lib

不做吗?

于 2009-03-17T17:08:23.650 回答
29

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

于 2009-03-18T08:11:56.497 回答
19
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,但不将它们作为一个整体包含在 megalib.so 中,则 --no-whole-archive 选项是必需的。

于 2010-09-08T12:57:34.137 回答
10

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

例子:

ar -x lib***.a
gcc -shared *.o -o lib***.so
于 2016-01-13T21:44:06.563 回答
7
ar -x lib***.a
gcc -shared *.o -o lib***.so
于 2017-05-04T08:24:35.347 回答