这个问题的标题是精确的欺骗 https://stackoverflow.com/questions/655163/convert-a-static-library-to-a-shared-library,但该问题的答案对我没有帮助。
我有一堆目标文件打包在静态库中:
% 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 而不是目标文件,但该库是really裸露的骨头:
% 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
如果你正在做一些更复杂的事情,你想要所有库 some 但只需要 libsome 所需的部分库支持,那么你会想要在 libsome 上使用它后关闭整个存档:
... -Wl,--whole-archive libsome.a -Wl,--no-whole-archive libsupport.a
如果您不使用 GNU 链接器,则需要查看您的链接器是否支持它以及它的名称。在 Sun 链接器上,它被称为-z allextract
and -z defaultextract
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)