c++ - 将静态库转换为共享库(从 libsome.a 创建 libsome.so): where's my symbols?

标签 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,一切都很好。

最佳答案

假设您使用的是 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

关于c++ - 将静态库转换为共享库(从 libsome.a 创建 libsome.so): where's my symbols?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2193944/

相关文章:

c++ - 使用命名空间代替类

c++ - 单步执行不起作用,但可以在某些汇编步骤后强制单步执行

c++ - 为什么 boost::interprocess::managed_shared_memory throw a boost::interprocess_exception upon construction?

android - 用于 5 个视频之间的交叉淡入淡出的 FFmpeg 命令。如何管理 setpts=PTS-STARTPTS?

Xcode,在单步执行框架时无法查看变量,该框架是在同一工作区中构建和链接的

python - 错误: command 'c++' failed with exit status 1

c++ - 现代 opengl 纹理金字塔

c++ - Qt Creator 编译错误(找不到.o 文件)

compilation - chdir 未声明,编译错误 g++

c++ - 共享对象文件中的版本号