You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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),因此不会触发该问题。具体原因及对应解决方式如下:

可能原因

  1. ABI不匹配:Homebrew GCC生成的目标文件格式,与Apple ld在处理嵌套模板实例化(如map<pair<char,char>, int>)时的解析逻辑存在冲突,导致链接器内部断言失败。
  2. 架构编译选项缺失:默认编译时未明确指定arm64架构,可能生成了与系统不兼容的目标文件,引发链接器解析错误。
  3. GCC版本bug:GCC 12.2.0在arm64 macOS上存在特定代码生成缺陷,导致目标文件不符合Apple链接器的预期标准。

解决办法

  • 强制使用GNU系链接器:编译时添加-fuse-ld=lld选项,用LLVM链接器替代Apple ld,命令示例:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:05:34