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++ を使うように修正。
https://trap.jp/post/1436/

追記

いろいろ触って設定が変わったせいかもしれないが、単純にコンパイル対象のファイルを全て指定すればよいだけだったかもしれない。以下の例だと 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 を修正。

https://qiita.com/yoskeoka/items/541b6a4260487fbc2c0f

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

余談、写経元のコードはこちら。
https://github.com/gameprogcpp/code/

このスクラップは2024/03/20にクローズされました