BOOK Studio947
狩野祐東・狩野さやか著書

VSCode(Mac) でC++のコンパイルができないときは

インタープリター/コンパイラーの勉強しようと思ってですね、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」をやろうと思ったらコンパイルできず、こんなダイアログが出て……

The preLaunchTask 'C/C++: clang build active file' terminated with exit code -1.

「The preLaunchTask ‘C/C++: clang build active file’ terminated with exit code -1.」と書いてある

 

ターミナルにはこんなエラーが。

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のコードを確認したほうがいいかもしれない、というお話でした。

狩野 祐東

Web/アプリケーションUIデザイナー、エンジニア。執筆家。 アメリカ・サンフランシスコに留学、UIデザイン理論を学ぶ。Webサイトやアプリケーションのデザイン・開発、関連技術書籍の執筆を数多く手がける。株式会社Studio947代表。