Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否将静态库转换为共享库?_C_Linux_Shared Libraries_Static Libraries - Fatal编程技术网

C 是否将静态库转换为共享库?

C 是否将静态库转换为共享库?,c,linux,shared-libraries,static-libraries,C,Linux,Shared Libraries,Static Libraries,我有一个第三方库,它主要由大量静态(.a)库文件组成。我可以把它编译成一个。一个库文件,但我真的需要它是一个。所以共享库文件 有没有办法把一个静态的.a文件转换成一个共享的.so文件?或者更一般地说,有没有一种好方法可以将大量的静态.a文件和一些.o对象文件组合成一个。那么文件呢?就是这样做的(当然有适当的-L) 不这样做?如果静态库中的对象在编译时没有使用-fPIC或类似工具,则不能这样做 g++ -shared -o megalib.so foo.o bar.o -Wl,--whole-ar

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

有没有办法把一个静态的
.a
文件转换成一个共享的
.so
文件?或者更一般地说,有没有一种好方法可以将大量的静态
.a
文件和一些
.o
对象文件组合成一个
。那么
文件呢?

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


不这样做?

如果静态库中的对象在编译时没有使用-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 linker选项,以将静态库中的对象包含在共享对象中。
如果您想链接到libc_static_lib.a和libother_shared_object.so,但不想将它们作为一个整体包含在megalib.so中,那么--no other archive选项是必需的。

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

示例:

ar -x lib***.a
gcc -shared *.o -o lib***.so

使用gcc-shared实现了这一点,但只是在我使用-fPIC重新编译之后。谢谢你给我指明了正确的方向!我知道这是一个古老的答案,但它。。。不起作用?对于我尝试过的每个静态库,生成的共享对象不再导出任何原始符号。在支持良好的目标上,
PIC
对于共享库代码来说不是必需的。它只会导致更高效地使用内存(可以共享大部分而不是少数页面),但会牺牲一些性能。在某些情况下,缺少-fPIC或类似的功能会导致SegFault
-Wl——在命令行末尾不需要整个存档。看。这不是取自另一个早期的答案,并以较少的上下文/解释发布吗?不,当时没有这样的答案。查看历史。我可以在网络浏览器中宣誓,它显示另一个的日期更早,但在手机应用程序中,它显示这一个是第一个。我道歉
ar-x
不支持解压缩归档文件列表,因此
ar-x lib1.a lib2.a…
将在归档文件中打印
无条目lib2.a
。解决方案是:
mk提取;并行ar—输出提取-x:::*.a
然后在
提取的
中运行
gcc
ar -x lib***.a
gcc -shared *.o -o lib***.so
ar -x lib***.a
gcc -shared *.o -o lib***.so