将静态库转换为共享库(从libsome.a创建libsome.so):我的符号在哪里?

时间:2010-02-03 17:30:47

标签: c++ g++ shared-libraries static-libraries ld

这个问题的标题是exact dupe,但该问题的答案对我没有帮助。

我有一堆打包在静态库中的目标文件:

% g++ -std=c++98 -fpic -g -O1 -c -o foo.o foo.cpp
% g++ -std=c++98 -fpic -g -O1 -c -o bar.o bar.cpp
% ar -rc libsome.a foo.o bar.o

我想从libsome.a而不是目标文件生成libsome.so,但是库真的准系统:

% g++ -std=c++98 -fpic -g -O1 -shared -o libsome.so libsome.a
% nm -DC libsome.so
0000xxxx A _DYNAMIC
0000xxxx A _GLOBAL_OFFSET_TABLE_
         w _Jv_RegisterClasses
0000xxxx A __bss_start
         w __cxa_finalize
0000xxxx A _edata
0000xxxx A _end
0000xxxx T _fini
0000xxxx T _init

静态库是可以的,或者至少我完全可以将它链接到可执行文件并让它运行包含的功能。如果我从foo.o和bar.o创建libsome.so,一切都很好。

2 个答案:

答案 0 :(得分:23)

假设您正在使用GNU链接器,则需要指定--whole-archive选项,以便获取静态存档的所有内容。既然这是一个链接器选项,你需要-Wl告诉gcc将它传递给链接器:

g++ -std=c++98 -fpic -g -O1 -shared -o libsome.so -Wl,--whole-archive libsome.a

如果您正在做一些更复杂的事情,你想要所有的库,但只有libsome所需的库支持部分,你会想要在libsome上使用它之后关闭整个存档:

... -Wl,--whole-archive libsome.a -Wl,--no-whole-archive libsupport.a

如果您没有使用GNU链接器,则需要查看链接器是否支持它以及它的名称。在Sun链接器上,它被称为-z allextract-z defaultextract

答案 1 :(得分:1)

您的文件未从.a文件中提取,因为没有任何内容引用它们。你为什么先制作.a文件?通过将它们与-r选项链接起来,您可以更好地制作.o文件。