問題
控制臺輸入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
這個問題之前出現(xiàn)過,當時升級xcode之后血淌,原本正常編譯運行的工程在低版本iOS手機會有報錯矩欠,查詢了解,是xcode15引入新的鏈接器ld_prime
六剥,新的鏈接器毫無疑問有諸多好處,但不可避免會有兼容性問題峰伙。
解決方式:
遇到這種問題疗疟,我們可以通過恢復到舊的鏈接器來解決。 鏈接器有兩個選項 -ld64
和 -ld_prime
瞳氓,Xcode15會默認使用新的ld_prime
策彤,我們在Xcode build setting
-> Other Linker Flags
添加 -ld_64
編譯參數(shù)來指定使用老的鏈接器。
擴展
鏈接器三種主要的實現(xiàn)歷史:
ld — 這可以追溯到 Mac OS X 誕生之初匣摘。
ld64 — 這是從 2005 年開始的重寫店诗。 最終它完全取代了ld。 如果輸入 ld音榜,您將得到 ld64庞瘸。
ld_prime — 這是在 Xcode 15 中引入的。這不是一個單獨的工具赠叼。 相反擦囊,ld 現(xiàn)在支持 -ld_classic 和 -ld_new 選項來選擇特定的實現(xiàn)。
參考資料
文檔:
1.《WWDC 2023 SESSION 10268 Meet mergeable libraries》
3.Xcode 15 beta build error: cfstring constant not pointer aligned on iOS 17
截圖: