我有一个第三方库,主要由大量静态(.a
)库文件组成。我可以把它编译成一个单一的.a
库文件,但我真的需要它是一个单一的.so
共享库文件。
有没有办法将静态.a
文件转换为共享.so
文件?或者更一般地说,有没有一种好方法可以将大量静态.a
文件与几个.o
目标文件组合成一个.so
文件?
我有一个第三方库,主要由大量静态(.a
)库文件组成。我可以把它编译成一个单一的.a
库文件,但我真的需要它是一个单一的.so
共享库文件。
有没有办法将静态.a
文件转换为共享.so
文件?或者更一般地说,有没有一种好方法可以将大量静态.a
文件与几个.o
目标文件组合成一个.so
文件?
这样做(当然有适当的-L)
gcc -shared -o megalib.so foo.o bar.o -la_static_lib -lb_static_lib
不做吗?
如果静态库中的对象是在没有 -fPIC 或类似的情况下编译的,则无法执行此操作。
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 选项是必需的。
ar -x
如果您想专注于.a
s 中的特定对象并且不想自己添加任何内容,这也很有用。
例子:
ar -x lib***.a
gcc -shared *.o -o lib***.so
ar -x lib***.a
gcc -shared *.o -o lib***.so