这个问题的标题是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,一切都很好。
最佳答案
假设您使用的是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
。