Closed2
【Mac】C++ のコンパイルで "ld: symbol(s) not found for architecture arm64"
C++の勉強し始めて、複数ファイルを作成したら遭遇。
$ g++ -o output/main main.cpp
Undefined symbols for architecture arm64:
"CSample::get()", referenced from:
_main in main-60e61a.o
"CSample::set(int)", referenced from:
_main in main-60e61a.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
問題
Mac だとデフォルトで clang
を使ってコンパイルするらしい。g++
を使っていても、エラーログには clang
とある。多分、clang
でも解決する方法があると思うけど、g++
を使うと解決するらしいので、g++
を使うように修正。
追記
いろいろ触って設定が変わったせいかもしれないが、単純にコンパイル対象のファイルを全て指定すればよいだけだったかもしれない。以下の例だと clang++
を明示的に指定。
clang++ -o output/main main.cpp Sample.cpp
対応
1. gcc をインストール
brew install gcc
2. g++ のバージョン違いに対応
g++-XX
のように XX
の部分にバージョンが入るので、最新バージョンを参照させる
ln -sf $(ls -d /opt/homebrew/bin/* | grep "/g++-" | sort -r | head -n1) /usr/local/bin/g++
export されているパスの順番によっては、clang
が読まれてしまうので、適宜 ~/.zshrc
を修正。
3. 複数ファイルを指定
g++ -o output/main main.cpp Sample.cpp
ヘッダーファイルに記載したクラスのメソッドの実装漏れがあっても同じようなエラーが出る。
ProcessInput
, UpdateGame
, GenerateOutput
を実装していなかったので、コンパイルが通らなかった。
頭と末尾のメッセージが上記の例と同じなので、わかりづらかった。
Undefined symbols for architecture arm64:
"Game::UpdateGame()", referenced from:
Game::RunLoop() in Game-cb8e46.o
"Game::ProcessInput()", referenced from:
Game::RunLoop() in Game-cb8e46.o
"Game::GenerateOutput()", referenced from:
Game::RunLoop() in Game-cb8e46.o
ld: symbol(s) not found for architecture arm64
余談、写経元のコードはこちら。
このスクラップは2024/03/20にクローズされました