使用HomeBrew g++编译器编译C++代码时出现链接错误求助
macOS下Homebrew GCC编译C++代码出现链接断言错误的原因
环境信息
- 操作系统:macOS
- 编译器:Homebrew GCC 12.2.0
测试代码
#include<bits/stdc++.h> using namespace std; int main(){ map<pair<char,char>,int> mp; pair<char,char> p={'a','b'}; mp[p]++; cout<<"yes"<<endl; }
错误信息
0 0x1004dc1a0 __assert_rtn + 140 1 0x100363a8c mach_o::relocatable::Parser<arm64>::parse(mach_o::relocatable::ParserOptions const&) + 4536 2 0x100335d38 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 0x10039e4ac ld::tool::InputFiles::makeFile(Options::FileInfo const&, bool) + 1468 4 0x1003a1360 ___ZN2ld4tool10InputFilesC2ER7Options_block_invoke + 56 5 0x195ac81f4 _dispatch_client_callout2 + 20 6 0x195adb954 _dispatch_apply_invoke + 224 7 0x195ac81b4 _dispatch_client_callout + 20 8 0x195ad9a04 _dispatch_root_queue_drain + 680 9 0x195ada104 _dispatch_worker_thread2 + 164 10 0x195c88324 _pthread_wqthread + 228 A linker snapshot was created at: /tmp/sk-2022-09-26-013526.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
编译器版本信息
g++ (Homebrew GCC 12.2.0) 12.2.0 Copyright (C) 2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
原因分析及解决办法
这个错误是Apple系统链接器ld与Homebrew GCC在arm64架构下的兼容性问题,在线编辑器通常使用GNU系链接器(如ld.gold或lld),因此不会触发该问题。具体原因及对应解决方式如下:
可能原因
- ABI不匹配:Homebrew GCC生成的目标文件格式,与Apple
ld在处理嵌套模板实例化(如map<pair<char,char>, int>)时的解析逻辑存在冲突,导致链接器内部断言失败。 - 架构编译选项缺失:默认编译时未明确指定arm64架构,可能生成了与系统不兼容的目标文件,引发链接器解析错误。
- GCC版本bug:GCC 12.2.0在arm64 macOS上存在特定代码生成缺陷,导致目标文件不符合Apple链接器的预期标准。
解决办法
- 强制使用GNU系链接器:编译时添加
-fuse-ld=lld选项,用LLVM链接器替代Appleld,命令示例:g++ -fuse-ld=lld your_code.cpp -o output - 显式指定架构编译:明确指定arm64架构编译,命令示例:
g++ -arch arm64 your_code.cpp -o output - 升级GCC版本:通过Homebrew升级到最新版GCC,后续版本可能修复了该兼容性问题:
brew upgrade gcc - 切换到Clang编译器:macOS自带的
clang++对Apple生态兼容性更好,可直接替代GCC编译这段代码:clang++ your_code.cpp -o output
内容的提问来源于stack exchange,提问作者Sanath Kumar Vengaldas
相关产品推荐
相关产品推荐

