端木Q
端木Q
  • 发布:2026-04-13 17:10
  • 更新:2026-04-13 17:11
  • 阅读:10

制作ios原生插件,在离线项目运行报错

分类:uni-app

离线打包工程5.0.3版本。新建了一个子工程,随便写一个方法,然后调用。debug模式正常,release报missing symbol called错误。然后关闭dead code stripping再编译,报如下错误
duplicate symbol '_kssymbolicator_callInstructionAddress' in:
/Users/zy/Desktop/SDK/SDK/Libs/KSCrash.framework/KSCrash(KSSymbolicator.o)
/Users/zy/Desktop/SDK/SDK/Libs/UMAPM.framework/UMAPM(KSSymbolicator.o)
duplicate symbol '_kscm_enableSwapCxaThrow' in:
/Users/zy/Desktop/SDK/SDK/Libs/KSCrash.framework/KSCrash(KSCrashMonitor_CPPException.o)
/Users/zy/Desktop/SDK/SDK/Libs/UMAPM.framework/UMAPM(KSCrashMonitor_CPPException.o)
duplicate symbol '_ksdl_getBinaryImageForHeader' in:
/Users/zy/Desktop/SDK/SDK/Libs/KSCrash.framework/KSCrash(KSDynamicLinker.o)
/Users/zy/Desktop/SDK/SDK/Libs/UMAPM.framework/UMAPM(KSDynamicLinker.o)
duplicate symbol '_enableSwapCxaThrow' in:
/Users/zy/Desktop/SDK/SDK/Libs/KSCrash.framework/KSCrash(KSCrashC.o)
/Users/zy/Desktop/SDK/SDK/Libs/UMAPM.framework/UMAPM(KSCrashC.o)
duplicate symbol '_pb_ostream_from_buffer' in:
/Users/zy/Desktop/SDK/SDK/Libs/MAMapKit.framework/MAMapKit(MAMapKit-arm64-master.o)
/Users/zy/Desktop/SDK/SDK/Libs/BaiduMapAPI_Base.framework/BaiduMapAPI_Base(pb_encode.o)
duplicate symbol '_pb_istream_from_buffer' in:
/Users/zy/Desktop/SDK/SDK/Libs/MAMapKit.framework/MAMapKit(MAMapKit-arm64-master.o)
/Users/zy/Desktop/SDK/SDK/Libs/BaiduMapAPI_Base.framework/BaiduMapAPI_Base(pb_decode.o)
ld: 6 duplicate symbols for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

2026-04-13 17:10 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

该问题是iOS第三方库依赖冲突导致的重复符号(duplicate symbols)错误。从错误日志看,存在以下冲突:

  1. KSCrash.frameworkUMAPM.framework 之间存在4个重复符号(KSSymbolicator、KSCrashMonitor_CPPException等相关)
  2. MAMapKit.framework(高德地图)与 BaiduMapAPI_Base.framework(百度地图)之间存在2个protobuf相关重复符号(pb_ostream_from_buffer、pb_istream_from_buffer)

关于 "missing symbol called" 错误,这是Release模式下开启 Dead Code Stripping(死代码剥离)导致的。当编译器认为某些符号未被直接使用而将其剥离,但运行时又动态调用了这些符号,就会报此错误。关闭该选项后暴露出底层的重复符号冲突。

解决方案

根据官方文档,请按以下步骤处理:

方案一:移除冲突的第三方库(推荐)

如果业务不需要同时集成冲突的SDK:

  • KSCrash vs UMAPM:两者都是崩溃统计/APM工具,保留SDK内置的,移除您手动添加的
  • 高德 vs 百度地图:如果同时集成,需要处理符号冲突;如非必需,建议只保留一个地图SDK

方案二:符号剥离(必须同时集成时)

如果必须同时保留这些库,需要对 .framework.a 文件进行符号剥离,移除重复的符号定义。具体操作可参考这篇文档移除对应库的冲突符号,然后测试功能是否正常。

方案三:处理开源库冲突

对于SDWebImage、ZXing等源码开源的三方库,SDK的 .h 头文件存放在 SDK/inc 路径中。建议使用SDK内置的三方库,将对应库的头文件引入到插件工程中使用,不要重复集成。

关于Dead Code Stripping

解决重复符号冲突后,如果仍需开启Dead Code Stripping(减小包体积),请确保:

  • Build SettingsDead Code Stripping 设置为 No(针对当前冲突情况)
  • 或在 Other Linker Flags 中添加 -all_load-force_load 确保关键符号不被剥离

注意:SDK内置的三方库版本说明请参考依赖的三方库版本说明,建议优先使用SDK已集成的库版本,避免版本冲突。

内容为 AI 生成,仅供参考

要回复问题请先登录注册