M1 Mac升级Xcode至2395版本后,make编译C++遇ld断言失败问题
M1 Mac升级Xcode 2395后make编译C++触发ld断言错误的解决方案
在M1芯片的Mac设备上升级Xcode至2395版本后,使用make工具编译C++代码时会触发链接器断言错误,错误日志如下:
0 0x1010c81a0 __assert_rtn + 140 1 0x100f4fa8c mach_o::relocatable::Parser<arm64>::parse(mach_o::relocatable::ParserOptions const&) + 4536 2 0x100f21d38 mach_o::relocatable::Parser<arm64>::parse(unsigned char const*, unsigned long long, char const*, long, ld::File::Ordinal, mach_o::relocatable::ParserOptions const&) + 148 3 0x100f8a4ac ld::tool::InputFiles::makeFile(Options::FileInfo const&, bool) + 1468 4 0x100f8d360 ___ZN2ld4tool10InputFilesC2ER7Options_block_invoke + 56 5 0x1893941f4 _dispatch_client_callout2 + 20 6 0x1893a7954 _dispatch_apply_invoke + 224 7 0x1893941b4 _dispatch_client_callout + 20 8 0x1893a5a04 _dispatch_root_queue_drain + 680 9 0x1893a6104 _dispatch_worker_thread2 + 164 10 0x189554324 _pthread_wqthread + 228 A linker snapshot was created at: /tmp/smr_dense_SL-2022-09-14-165143.ld-snapshot ld: Assertion failed: (_file->_atomsArrayCount == computedAtomCount && "more atoms allocated than expected"), function parse, file macho_relocatable_file.cpp, line 2061. collect2: error: ld returned 1 exit status make: *** [smr_dense_SL] Error 1
这个错误源于链接器ld解析mach-o可重定位文件时的原子计数不匹配,属于新版本Xcode链接器的兼容性问题,或是旧编译产物、架构不兼容导致的,可尝试以下解决方法:
- 清理旧编译产物:执行
make clean清除所有目标文件和中间产物,再重新执行make编译,避免旧文件与新版本链接器冲突 - 明确指定编译架构:在Makefile的编译和链接选项中添加
-arch arm64,确保所有目标文件都为arm64架构,避免混合架构触发链接器断言 - 更新Xcode命令行工具:运行
xcode-select --install更新命令行工具,保证其与Xcode主版本完全同步 - 检查第三方依赖:如果项目使用了预编译的第三方库,确认这些库是针对arm64架构编译且适配当前Xcode版本的,替换为兼容版本
- 临时降级Xcode:若上述方法均无效,可暂时降级到之前能正常编译的Xcode版本,等待Apple修复该链接器bug
内容的提问来源于stack exchange,提问作者xuezou
相关产品推荐
相关产品推荐

