Xcode 16.4 + iOS 18 系统运行时瓦解:___cxa_current_primary_exception 符号丢失的缘故原由与办理方案

[复制链接]
发表于 昨天 10:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在使用 Xcode 16.4 构建项目,运行到 iOS 18.3 或更早版本系统(包括模仿器)时,出现了如下的运行时瓦解
  1. dyld[22183]: Symbol not found: ___cxa_current_primary_exception
  2.   Referenced from: /.../WidgetOn.app/WidgetOn.debug.dylib
  3.   Expected in:     /usr/lib/libc++.1.dylib
复制代码
本文将讨论一下这个运行时报错的办理方案。
问题配景

这是一个典型的 运行时动态链接失败(dyld) 错误,表面上是找不到 ___cxa_current_primary_exception 符号,实质上是 Swift 6.1 / Xcode 16.4 使用的 C++ ABI 运行时 与老版本 iOS 不兼容。
瓦解根因剖析

在 iOS 18.4 及更高版本中,Apple 对 libc++ 动态库的内部布局做了修改:


  • 一些 C++ 非常处理相关符号(如 ___cxa_current_primary_exception)原本只存在于 libc++abi.dylib 中;
  • 在新系统中,这些符号被“重定向(indirect)”到 libc++.dylib,并不再直接袒露在 libc++abi.dylib;
  • 编译器在链接时会以为这些符号来自 libc++.dylib;
  • 但当 App 在旧版系统上运行时,libc++.dylib 并没有这些符号;
  • 于是 dyld 报错:符号找不到,步伐瓦解
一句话就是Apple 在 iOS 18.4+ 系统中变更了 C++ ABI 符号分布,导致旧系统运行时找不到某些关键符号。
办理方案:逼迫链接顺序以确保兼容

为了办理这一兼容性问题,我们必要:
让链接器优先从 libc++abi.dylib中加载符号,而不是 libc++.dylib

方法:在项目标 Other Linker Flags(OTHER_LDFLAGS)中添加:
  1. -Wl,-force_load,$(SDKROOT)/usr/lib/libc++abi.tbd
  2. -Wl,-weak_library,$(SDKROOT)/usr/lib/libc++.tbd
  3. -Wl,-weak_library,$(SDKROOT)/usr/lib/libc++.1.tbd
复制代码
参数阐明:
  参数
  阐明
  -Wl
  将参数通报给底层链接器 ld
  -force_load
  逼迫包罗指定库中的全部符号
  -weak_library
  链接为可选库,在旧系统不存在时不会报错
  $(SDKROOT)
  当前 Xcode 使用的 SDK 路径
  出现问题的常见泉源

可能会在以下场景中遇到该问题:


  • 使用 C++ 混编或 Objective-C++;
  • 引入某些广告 SDK、调试 SDK、动态注入工具(如 InjectionIII);
  • 系统调试工具在构建时注入 .debug.dylib;
  • .xcframework 或 binary-only pod 中静态链接了 libc++。
发起设置方式:使用 .xcconfig

推荐在工程中新建一个设置文件 CompatibilityFlags.xcconfig,写入:
  1. // 在 iOS 18.4 及以上版本 中,很多原本只存在于 libc++abi.dylib 中的符号(例如 ___cxa_current_primary_exception),现在被间接定义到了 libc++.dylib 中;
  2. // 但在 iOS 18.3 及以下版本 中,这些符号在 libc++.dylib 中根本就不存在,是“未定义”的。所以当你编译时链接的是 libc++.dylib 中的符号;运行时在老系统中找不到对应实现;
  3. // 导致 dyld(动态链接器)报错,应用在启动时崩溃。
  4. // 解决办法是 强制链接顺序:让 libc++abi.dylib 的链接优先于 libc++.dylib。编译器会把符号绑定到 libc++abi.dylib 而不是 libc++.dylib
  5. OTHER_LDFLAGS = $(inherited) \
  6.   -Wl,-force_load,$(SDKROOT)/usr/lib/libc++abi.tbd \
  7.   -Wl,-weak_library,$(SDKROOT)/usr/lib/libc++.tbd \
  8.   -Wl,-weak_library,$(SDKROOT)/usr/lib/libc++.1.tbd
复制代码
然后在 Xcode 中为 Debug 或所有构创建置导入使用它。
总结

以上也只是一个临时办理方案,还是盼望苹果能从底层办理这个问题,毕竟现在还有很多大项目向前兼容的很多,以致还有些是 Swift OC 混编的项目。
最后盼望上面的办理方案能帮助到遇到这个报错的朋友,文中如果有什么不对的地方,还望路过的朋友指正。
如果觉得有帮助,还望点个赞,添加个关注,笔者也会不断地积极,写出更多更好用的文章。
参考文章:After updating to Xcode 16.3, gett… | Apple Developer Forums


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5

GMT+8, 2025-6-27 19:44 , Processed in 0.240517 second(s), 33 queries 手机版|qidao123.com技术社区-IT企服评测▪应用市场 ( 浙ICP备20004199 )|网站地图

快速回复 返回顶部 返回列表