问题
控制台输入bt,查看崩溃堆栈
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x600000020)
frame #0: 0x0000000101bdbfa4 CBGMSCManger`std::__1::__tree_iterator<std::__1::__value_type<int, ResLoaderCreater*>, std::__1::__tree_node<std::__1::__value_type<int, ResLoaderCreater*>, void*>*, long> std::__1::__tree<std::__1::__value_type<int, ResLoaderCreater*>, std::__1::__map_value_compare<int, std::__1::__value_type<int, ResLoaderCreater*>, std::__1::less<int>, true>, std::__1::allocator<std::__1::__value_type<int, ResLoaderCreater*>>>::find<int>(int const&) + 20
frame #1: 0x0000000101bdbcd4 CBGMSCManger`int Factroy_ResLoader::register_res<ConcreateResLoaderCreate<ResLoader_Filler_KeyWord>>(int, ConcreateResLoaderCreate<ResLoader_Filler_KeyWord>) + 32
frame #2: 0x0000000101bdbbd8 CBGMSCManger`Register::init() + 56
frame #3: 0x000000010195a1b8 dyld`ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) + 428
frame #4: 0x000000010195a58c dyld`ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) + 52
frame #5: 0x00000001019555d0 dyld`ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 548
frame #6: 0x000000010195553c dyld`ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 400
frame #7: 0x0000000101954334 dyld`ImageLoader::processInitializers(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 184
frame #8: 0x00000001019543fc dyld`ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) + 92
frame #9: 0x0000000101946420 dyld`dyld::initializeMainExecutable() + 216
frame #10: 0x000000010194adb4 dyld`dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**, unsigned long*) + 4616
frame #11: 0x0000000101945208 dyld`dyldbootstrap::start(dyld3::MachOLoaded const*, int, char const**, dyld3::MachOLoaded const*, unsigned long*) + 396
* frame #12: 0x0000000101945038 dyld`_dyld_start + 56
这个问题之前出现过,当时升级xcode之后,原本正常编译运行的工程在低版本iOS手机会有报错,查询了解,是xcode15引入新的链接器ld_prime
,新的链接器毫无疑问有诸多好处,但不可避免会有兼容性问题。
解决方式:
遇到这种问题,我们可以通过恢复到旧的链接器来解决。 链接器有两个选项 -ld64
和 -ld_prime
,Xcode15会默认使用新的ld_prime
,我们在Xcode build setting
-> Other Linker Flags
添加 -ld_64
编译参数来指定使用老的链接器。
扩展
链接器三种主要的实现历史:
ld — 这可以追溯到 Mac OS X 诞生之初。
ld64 — 这是从 2005 年开始的重写。 最终它完全取代了ld。 如果输入 ld,您将得到 ld64。
ld_prime — 这是在 Xcode 15 中引入的。这不是一个单独的工具。 相反,ld 现在支持 -ld_classic 和 -ld_new 选项来选择特定的实现。
参考资料
文档:
1.《WWDC 2023 SESSION 10268 Meet mergeable libraries》
3.Xcode 15 beta build error: cfstring constant not pointer aligned on iOS 17
截图: