此问题的标题是一个确切欺骗 ,但在这个问题的答案不帮我。

我有一堆装在一个静态库对象文件:

% 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存档选项,这样你会得到的静态档案的全部内容。由于这是一个连接选项,则需要轮候册告诉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

其他提示

您的文件不被从某文件,因为没有什么是引用它们拉。为什么你第一次制作某文件?你有更好的运气与-r选项链接它们使.o文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top