如何在Mac链接器中导出静态库中的符号?
Apple平台强制导出静态库符号的实现方法
默认情况下,静态库中的符号即便标记了dllexport或设置为默认可见性,也不会被导出到最终的动态库或可执行文件中。针对Apple平台的ld链接器,可通过以下两种方式实现强制导出:
1. 导出单个特定符号
使用-Wl,-u,_symbol_name链接参数,强制链接器保留并导出指定符号:
- 对于C语言符号,需要在名称前添加下划线(符合Apple平台的符号修饰规则),例如导出函数
foo的参数为:-Wl,-u,_foo - 对于C++符号,需使用经过名字修饰后的完整符号名,或通过
extern "C"修饰符号以避免名字混淆
示例链接命令片段:
clang -shared -o liboutput.dylib input.o -Wl,-u,_my_c_function -Wl,-u,_ZNMyClassMyMethodEv ./libmylib.a
2. 导出整个静态库的所有符号
使用-Wl,-force_load,path/to/library.a参数,等效于GNU链接器的--whole-archive,会强制链接静态库内的所有目标文件,导出其中所有可见符号:
示例链接命令片段:
clang -shared -o liboutput.dylib input.o -Wl,-force_load,./libmylib.a
Xcode中配置方式
若使用Xcode开发,可在项目的Build Settings → Other Linker Flags中直接添加上述参数。
内容的提问来源于stack exchange,提问作者jiandingzhe
相关产品推荐
相关产品推荐

