インタープリター/コンパイラーの勉強しようと思ってですね、Macに手軽なC++コードのコンパイル環境を用意しようとして調べたら、VSCodeでできるらしいじゃないか。アプリを作るわけじゃないし、特殊なライブラリーを使うわけでもないし、XcodeでやるよりVSCodeのほうが手軽そうなのでやってみました。
が、うまくいかない……
「vscode c++ compile」とかで検索するといろいろ引っかかるんだけど、VSCodeに余計な(本来不要な)エクステンションをインストールしたり、gccをインストールせよみたいなのが多く(Clangがあるのにわざわざ古いgccでやる必要ないとわたしは思う)、なかには若干信頼性に欠ける記事もある。でも、ちょっと探すと公式(Microsoft)がVSCode + Clangのコンパイル環境の構築方法を紹介していたので、それに従うことにした。それが次のページ(英語)。
Configure VS Code for Clang/LLVM on macOS
私の環境ではXcodeとXcode コマンドラインツールはインストール済み、あとはVSCodeにC/C++エクステンションをインストールすればいいのね。よしよし。エクステンションをインストールし、このページに載っているサンプルコードのファイルを作って…… とここまでは順調だったのだけれど、いざ動作確認で「Run C/C++ File」をやろうと思ったらコンパイルできず、こんなダイアログが出て……
ターミナルにはこんなエラーが。
clang: error: linker command failed with exit code 1 (use -v to see invocation)
というのがよくわからない。同じコードをXcodeでコンパイルしたら問題なくできたので、これはVSCodeかエクステンションの問題か、なにか設定が間違っているに違いないと推測。上記のページの続きを読んでみると、「.vscode
っていうフォルダができて、そのなかに tasks.json
というファイルができて、そのファイルの中身の例はこれね」って書いてあって、その下にコードが書いてある。で、実際に作られたtasks.jsonファイルをよーく見てみると、うーん、たしかにちょっと違う。最初は「中身の例はこれ」っていうのに引っ張られて無視していて、気づくのに時間がかかってしまった。
tasks.jsonの上の数行部分が以下。できたファイルはこうなっていた。
{ "tasks": [ { "type": "cppbuild", "label": "C/C++: clang build active file", "command": "/usr/bin/clang", ...
VSCodeのヘルプページと違うのは "command"
キーの部分で、ヘルプページでは "command": "/usr/bin/clang++",
となっている。もしかしてこれじゃない? と思って、task.jsonを編集。「/usr/bin/clang」のうしろに「++」を足す。
"command": "/usr/bin/clang++",
と…… うまくコンパイルできた! ああ、たったこれだけのわりに解決まで時間がかかった。
ということで、XcodeではコンパイルできるC++のファイルがVSCodeではコンパイルできないときは、tasks.jsonのコードを確認したほうがいいかもしれない、というお話でした。