You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS发布打包时全局符号被剥离导致动态库调用崩溃的解决方案咨询

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 07:34:39