Macbook Air Apple M2 を購入し、競プロの環境構築中に遭遇したエラー。
すでに Homebrew で gcc をインストールしており、g++ で clang ではなく gcc が呼び出されているようになっている。(Homebrew GCC 13.2.0)
再現コード
#include <vector> int main() { std::vector<int> a; return 0; }
std::vector
を使おうとするとエラーが出る。
エラー出力
% g++ main.cpp ld: warning: ignoring duplicate libraries: '-lgcc' 0 0x104f77648 __assert_rtn + 72 1 0x104eabfac ld::AtomPlacement::findAtom(unsigned char, unsigned long long, ld::AtomPlacement::AtomLoc const*&, long long&) const + 1204 2 0x104ec1924 ld::InputFiles::SliceParser::parseObjectFile(mach_o::Header const*) const + 15164 3 0x104ecee30 ld::InputFiles::parseAllFiles(void (ld::AtomFile const*) block_pointer)::$_7::operator()(unsigned long, ld::FileInfo const&) const + 420 4 0x184138440 _dispatch_client_callout2 + 20 5 0x18414bf1c _dispatch_apply_invoke + 224 6 0x184138400 _dispatch_client_callout + 20 7 0x184149fb8 _dispatch_root_queue_drain + 684 8 0x18414a6c0 _dispatch_worker_thread2 + 164 9 0x1842e4038 _pthread_wqthread + 228 ld: Assertion failed: (resultIndex < sectData.atoms.size()), function findAtom, file Relocations.cpp, line 1336. collect2: error: ld returned 1 exit status
原因
ld: Assertion failed: (resultIndex < sectData.atoms.size()) にもあるように、リンカーのバグで、Xcode 15 以上で発生するらしい。 スレッドの開始日がこの記事を書いた 1 週間前くらいで、かなり最近発生したバグっぽい。
解決策
GitHub の issue にあった解決策を試した。
コンパイルオプションを使う
結局のところ Xcode 14 以前なら大丈夫っぽいので、-ld_classic
をつけてコンパイルすれば良い。
reinstall する
brew reinstall -sv gcc
すればオプション無しでも大丈夫らしい(が、時間がかかるようなので実行していない)。
追記(2024/05/15)
コンパイルオプションの -fsanitize=undefined,address
が使えないので現在は諦めて clang を使っている。
実は #include <bits/stdc++.h>
ができないこと以外はほぼ気にならない。