iOS发布打包时全局符号被剥离导致动态库调用崩溃的解决方案咨询
各位好,我遇到了一个CocoaPods库的符号保留问题,想请教大家有没有可行的解决方案:
我开发了一个CocoaPods库,里面暴露了几个全局C函数,用下面的宏来声明可见性:
#define EXPORT __attribute__((visibility("default"), used, retain)) extern "C" EXPORT void ios_prepare_request(const char *url) { // 内部Obj-C实现代码 }
库内部会加载一个dylib,这个dylib需要调用这些全局C函数。在Xcode本地运行时一切正常,但当把App打包上传到TestFlight或者进行调试部署时,打包过程的符号剥离步骤会把这些全局符号删掉,导致dylib调用时出现空指针引用,直接崩溃。
我尝试了几种方案,但都没找到理想的解决办法:
修改用户目标的剥离策略
我在podspec里给用户目标的xcconfig设置了STRIP_STYLE为non-global:s.user_target_xcconfig = { 'STRIP_STYLE' => 'non-global' }这个方法确实能解决崩溃问题,但会直接修改用户项目的配置,影响用户目标的符号剥离逻辑,显然不是理想的方案。
转成动态框架并使用
-export_symbols_list
苹果工程师建议用链接器标志-export_symbols_list来指定要导出的符号,但这个标志只对动态库有效,而CocoaPods默认生成静态库。于是我把库改成了动态框架,同时配置了导出符号列表:s.static_framework = false s.preserve_paths = 'exports.exp' s.pod_target_xcconfig= { 'OTHER_LDFLAGS' => '$(inherited) -Wl,-exported_symbols_list,$(PODS_TARGET_SRCROOT)/exports.exp', }但测试后发现这个方案完全无效,符号还是会被剥离。
使用
-u链接器标志强制保留符号
我参考建议尝试给用户目标添加-u标志,指定要强制保留的单个符号:s.user_target_xcconfig = { 'OTHER_LDFLAGS' => '$(inherited) -Wl,-u,_ios_prepare_request' }可惜这个方法也没有效果,符号依然被剥离。
目前我用了一个临时方案:把需要调用的函数的原始指针传递给dylib,让dylib存储这些指针后再调用。这个方法能正常工作,但操作起来非常繁琐,我还是希望能通过全局函数的方式来实现,不用这么麻烦。
请问有没有其他可行的方案,能在不影响用户目标配置的前提下,确保这些全局C函数的符号不会被打包过程剥离?
内容来源于stack exchange

