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

这个问题的标题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选项,以便您可以获取静态归档的所有内容.因为这是一个链接器选项,你需要 – 告诉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.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...