VSCodeでC++をコンパイルする方法

採用はこちら

VSCodeでC++をコンパイルするには、VSCode本体だけでなく、C++コンパイラを別途用意する必要があります。

VSCodeはソースコードを編集するためのエディターであり、C++のソースコードを直接コンパイルする機能そのものは備えていません。

一般的には、次の3つを準備します。

  • Visual Studio Code
  • Microsoftの「C/C++」拡張機能
  • GCC・Clang・MSVCなどのC++コンパイラ

特に重要なのは、「C/C++拡張機能」と「C++コンパイラ」は別物だという点です。

C/C++拡張機能はコード補完やエラー表示、デバッグ支援などを提供しますが、実際のコンパイル処理はGCCやClang、MSVCなどが行います。

目次

VSCodeにC/C++拡張機能をインストールする

拡張機能画面を開く

まず、VSCodeでMicrosoftの「C/C++」拡張機能をインストールします。

VSCode左側にある拡張機能アイコンをクリックするか、WindowsやLinuxでは次のショートカットを使用します。

Ctrl + Shift + X

検索欄に「C++」と入力し、Microsoftが提供している「C/C++」を選択してインストールします。

C/C++拡張機能で利用できる主な機能

C/C++拡張機能を導入すると、主に次のような機能を利用できます。

  • C++のシンタックスハイライト
  • IntelliSenseによるコード補完
  • エラーや警告の表示
  • 定義や参照先へのジャンプ
  • デバッグ支援
  • ビルドタスクとの連携

ただし、この拡張機能だけではC++をコンパイルできません。

別途、C++コンパイラが必要です。

C++コンパイラを準備する

利用するコンパイラはOSによって異なります。

代表的な組み合わせは次のとおりです。

OS主なC++コンパイラ
WindowsGCC、MSVC、Clang
macOSClang
LinuxGCC、Clang

WindowsでC++コンパイラを導入する

GCCを使用する場合

WindowsでGCCを利用する場合は、MSYS2などを利用してMinGW-w64系のGCCツールチェーンを導入する方法があります。

インストール後、VSCodeのターミナルで次のコマンドを実行します。

g++ --version

GCCのバージョン情報が表示されれば利用できます。

もし、

'g++' is not recognized

などのエラーが表示される場合は、GCCがインストールされていないか、実行ファイルの場所がPATH環境変数に追加されていない可能性があります。

MSVCを使用する場合

WindowsではMicrosoft製のMSVCを使用することもできます。

MSVCのC++コンパイラは、

cl.exe

です。

Visual StudioやVisual Studio Build Toolsをインストールすると利用できます。

MSVCはPATHだけでなくWindows SDKやライブラリ関連の環境変数も必要になるため、Developer Command PromptやDeveloper PowerShellなど、Visual Studio用の開発環境が設定されたターミナルからVSCodeを起動すると扱いやすくなります。

macOSでC++コンパイラを導入する

macOSでは一般的にClangを使用します。

まずターミナルで、次のコマンドを実行します。

clang++ --version

または、

clang --version

と入力します。

Clangがインストールされていない場合は、Command Line Toolsを導入します。

xcode-select --install

インストール後、再度バージョン確認を行います。

LinuxでC++コンパイラを導入する

LinuxではGCCのg++を利用する方法が一般的です。

UbuntuやDebian系Linuxでは、次のようにインストールできます。

sudo apt update
sudo apt install build-essential

インストール後に、

g++ --version

を実行し、バージョン情報が表示されれば準備完了です。

C++ファイルを作成する

コンパイラの準備ができたら、C++ファイルを作成します。

例えば、

hello.cpp

というファイルを作成し、次のコードを記述します。

#include <iostream>

int main()
{
    std::cout << "Hello World!" << std::endl;
    return 0;
}

ファイルを保存したら、ターミナルからコンパイルできます。

VSCodeのターミナルからC++をコンパイルする

GCCでコンパイルする

hello.cppが保存されているディレクトリで、次のコマンドを実行します。

g++ hello.cpp -o hello

それぞれの意味は次のとおりです。

g++

C++コンパイラを実行します。

hello.cpp

コンパイルするC++ソースファイルです。

-o hello

生成する実行ファイル名をhelloに指定します。

厳密には、このコマンドではソースコードのコンパイルだけでなく、通常はリンク処理まで行われ、最終的な実行ファイルが生成されます。

コンパイルしたプログラムを実行する

Windowsの場合

Windowsでは、一般的に次のような実行ファイルが生成されます。

hello.exe

PowerShellでは、次のように実行します。

.\hello.exe

macOS・Linuxの場合

macOSやLinuxでは、次のように実行します。

./hello

正常に動作すると、

Hello World!

と表示されます。

C++17・C++20・C++23を指定してコンパイルする

使用するC++規格を明示したい場合は、-stdオプションを使用します。

C++17を指定する

g++ -std=c++17 hello.cpp -o hello

C++20を指定する

g++ -std=c++20 hello.cpp -o hello

C++23を指定する

g++ -std=c++23 hello.cpp -o hello

Clangでも同様に、

clang++ -std=c++20 hello.cpp -o hello

のように指定できます。

ただし、利用できるC++規格や機能はコンパイラのバージョンによって異なります。

また、コンパイラのデフォルト規格はバージョンや環境によって異なるため、必要な規格がある場合は明示しておくと分かりやすくなります。

コンパイル時に警告を表示する

開発時には警告オプションを有効にしておくと、潜在的な問題を見つけやすくなります。

例えば、GCCやClangでは次のように指定できます。

g++ -std=c++20 -Wall -Wextra hello.cpp -o hello

さらに厳密にチェックしたい場合は、

g++ -std=c++20 -Wall -Wextra -pedantic hello.cpp -o hello

とする方法もあります。

-Wallは多くの代表的な警告を有効にしますが、文字どおりすべての警告を有効にするオプションではありません。

デバッグ情報を付けてコンパイルする

VSCodeのデバッガを使用する場合は、デバッグ情報を含めてコンパイルします。

GCCやClangでは、-gオプションを使用します。

g++ -g hello.cpp -o hello

警告やC++規格の指定と組み合わせる場合は、例えば次のようになります。

g++ -std=c++20 -Wall -Wextra -g hello.cpp -o hello

VSCodeからビルドする

毎回ターミナルでg++コマンドを入力しなくても、VSCodeのビルドタスクを利用できます。

ビルドタスクを利用する

C++ファイルを開き、コマンドパレットやC/C++拡張機能の実行・デバッグ機能からコンパイラを選択すると、必要に応じてVSCodeのビルド設定が作成されます。

環境によっては、

C/C++: g++ build active file
C/C++: clang++ build active file
C/C++: cl.exe build active file

などの項目が表示されます。

VSCodeのバージョンやC/C++拡張機能の状態によって、表示されるメニュー名や操作手順が多少異なる場合があります。

tasks.jsonでビルド設定を管理する

VSCodeでは、

.vscode/tasks.json

にビルドタスクを設定できます。

例えばGCCを使う場合は、次のような設定にできます。

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ build active file",
            "command": "g++",
            "args": [
                "-std=c++20",
                "-Wall",
                "-Wextra",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

tasks.jsonでよく使う変数

${file}

現在アクティブになっているファイルです。

${fileDirname}

現在のファイルが存在するディレクトリです。

${fileBasenameNoExtension}

拡張子を除いたファイル名です。

例えば、

C:\cpp\hello.cpp

を開いている場合、実質的には次のようなコマンドに相当します。

g++ -std=c++20 -Wall -Wextra -g hello.cpp -o hello

ショートカットでビルドする

デフォルトのビルドタスクを設定しておけば、WindowsやLinuxでは、

Ctrl + Shift + B

でビルドを実行できます。

例えば、

コードを書く
↓
Ctrl + Sで保存
↓
Ctrl + Shift + Bでビルド
↓
実行

という流れで開発できます。

複数のビルドタスクが設定されている場合は、実行するタスクの選択が必要になることがあります。

複数のC++ファイルをコンパイルする

C++では、複数のソースファイルを使用することがあります。

例えば、

main.cpp
calculator.cpp
calculator.hpp

という構成なら、

g++ main.cpp calculator.cpp -o app

とコンパイルできます。

C++20を使用するなら、

g++ -std=c++20 main.cpp calculator.cpp -o app

と指定します。

ワイルドカードを使用する場合の注意点

bashやzshなどの環境では、

g++ *.cpp -o app

のように複数の.cppファイルを指定できる場合があります。

ただし、ワイルドカードの展開はシェルやOSによって挙動が異なる可能性があります。

Windowsを含めた幅広い環境で確実に動作させたい場合は、

g++ main.cpp calculator.cpp -o app

のように、対象ファイルを明示する方法が分かりやすいでしょう。

コンパイルとビルドの違い

「コンパイル」と「ビルド」は、厳密には同じ意味ではありません。

コンパイルとは

コンパイルは、C++のソースコードをオブジェクトコードなどに変換する処理です。

例えば、

g++ -c main.cpp

を実行すると、一般的には、

main.o

というオブジェクトファイルが生成されます。

リンクとは

リンクは、複数のオブジェクトファイルやライブラリを組み合わせて、最終的な実行ファイルを作成する処理です。

例えば、

main.o
calculator.o
↓
app

という流れになります。

ビルドとは

一般的にビルドは、

コンパイル
+
リンク
+
必要に応じたその他の処理

をまとめた言葉です。

そのため、

g++ main.cpp calculator.cpp -o app

は日常的には「コンパイルする」と表現されることがありますが、実際にはコンパイルとリンクまで行っています。

tasks.jsonとc_cpp_properties.jsonの違い

VSCodeでC++を使用すると、

tasks.json

と、

c_cpp_properties.json

が登場することがあります。

この2つは役割が異なります。

tasks.jsonの役割

tasks.jsonは、VSCodeから実行するビルドタスクを設定するファイルです。

例えば、

どのコンパイラを使うか
どのオプションを付けるか
どのファイルをコンパイルするか
どの名前で実行ファイルを生成するか

などを設定できます。

実際のコンパイル時に、

g++ -std=c++20 ...

を使用したい場合は、tasks.jsonなどのビルド設定で-std=c++20をコンパイラに渡す必要があります。

c_cpp_properties.jsonの役割

c_cpp_properties.jsonは、主にMicrosoftのC/C++拡張機能が利用するIntelliSense設定を管理します。

例えば、

"compilerPath": "/usr/bin/g++"

のようにコンパイラの場所を指定できます。

また、

"cppStandard": "c++20"

と設定することもできます。

ただし、ここでcppStandardをc++20に設定しただけでは、実際のコンパイル時に自動で、

-std=c++20

が指定されるとは限りません。

つまり、

c_cpp_properties.json
→ IntelliSense・コード解析側の設定
tasks.json
→ 実際のビルドコマンド側の設定

と考えると分かりやすいでしょう。

なお、C/C++拡張機能がコンパイラを自動検出できる場合は、必ずしもc_cpp_properties.jsonを手動で作成する必要はありません。

launch.jsonの役割

launch.jsonは、主にデバッガの起動設定を管理するファイルです。

役割を整理すると、次のようになります。

ファイル主な役割
tasks.jsonビルドタスク
launch.jsonデバッガの起動設定
c_cpp_properties.jsonIntelliSense設定

launch.jsonのpreLaunchTaskにビルドタスクを指定すると、

F5
↓
ビルド
↓
デバッグ開始

という流れを作ることもできます。

「g++が見つからない」と表示される場合

コンパイラがインストールされているか確認する

まず、

g++ --version

を実行します。

バージョン情報が表示されない場合は、GCCがインストールされていない可能性があります。

PATHを確認する

GCCがインストールされていても、実行ファイルがあるディレクトリがPATHに含まれていない場合は、VSCodeからg++を実行できません。

その場合は、GCCのインストール先やPATH環境変数を確認します。

iostreamに赤線が表示される場合

例えば、

#include <iostream>

に赤い波線が表示されることがあります。

この場合でも、必ずしもコンパイルエラーとは限りません。

IntelliSense設定に問題がある場合

主な原因には、次のようなものがあります。

  • コンパイラが正しく検出されていない
  • compilerPathが間違っている
  • C++ツールチェーンが正しくインストールされていない
  • IntelliSenseの設定と実際のビルド設定が一致していない

問題を切り分けるには、まずターミナルで、

g++ main.cpp -o main

を実行してみます。

これで正常にコンパイルできる場合は、C++コードやコンパイラではなく、VSCodeのIntelliSense側に問題がある可能性があります。

undefined referenceが表示される場合

GCC系の環境で、

undefined reference to ...

と表示される場合は、リンク関連の問題であることがよくあります。

例えば、

int add(int a, int b);

という宣言があり、実装がcalculator.cppにある場合、

g++ main.cpp -o app

だけでは実装がリンクされません。

次のように、必要なソースファイルも指定します。

g++ main.cpp calculator.cpp -o app

ただし、undefined referenceにはほかにも、

  • 外部ライブラリをリンクしていない
  • 関数の宣言と定義が一致していない
  • 名前空間が異なっている
  • テンプレートの定義場所に問題がある

など、さまざまな原因があります。

小規模なC++開発ならtasks.jsonでも対応できる

学習用途や小規模なプログラムなら、

VSCode
+
C/C++拡張機能
+
GCC・Clang・MSVC
+
tasks.json

という構成でも十分です。

例えば、

project/
├─ main.cpp
├─ calculator.cpp
├─ calculator.hpp
└─ .vscode/
   ├─ tasks.json
   └─ launch.json

のような構成にできます。

本格的なC++プロジェクトではCMakeも検討する

ソースファイルやライブラリが増えてくると、tasks.jsonに直接すべてのビルド処理を書く方法では管理しにくくなります。

例えば、

src/
include/
tests/
external/

などの構成を持つプロジェクトでは、CMakeなどのビルド関連ツールを利用すると管理しやすくなります。

概念的には、

VSCode
↓
CMake
↓
Make / Ninjaなど
↓
GCC / Clang / MSVC
↓
実行ファイル

という構成になります。

CMake自体はC++コンパイラではなく、主にビルド方法を構成・生成するためのツールです。

VSCodeでC++をコンパイルする基本的な流れ

初心者の場合は、次の順番で覚えると分かりやすいでしょう。

1. VSCodeをインストール
        ↓
2. C/C++拡張機能をインストール
        ↓
3. GCC・Clang・MSVCを用意
        ↓
4. g++ --versionなどで確認
        ↓
5. main.cppを作成
        ↓
6. ターミナルから直接コンパイル
        ↓
7. 実行して動作確認
        ↓
8. tasks.jsonでビルドを自動化
        ↓
9. launch.jsonでデバッグ設定
        ↓
10. 必要に応じてCMakeなどを導入

最初からVSCodeの設定ファイルだけを編集するよりも、まず、

g++ main.cpp -o main

のようにターミナルから直接コンパイルすると、VSCodeとコンパイラの役割を理解しやすくなります。

まとめ

VSCodeでC++をコンパイルするには、VSCode本体とC/C++拡張機能だけでなく、GCC・Clang・MSVCなどのC++コンパイラが必要です。

最初はターミナルから、

g++ -std=c++20 -Wall -Wextra main.cpp -o main

のように直接コンパイルすると、C++のビルドの仕組みを理解しやすくなります。

慣れてきたらtasks.jsonを設定してショートカットからビルドできるようにし、launch.jsonを組み合わせることでデバッグも効率化できます。

また、c_cpp_properties.jsonは主にIntelliSenseの設定に使われるため、実際のコンパイル設定とは役割が異なる点にも注意が必要です。

ソースファイルが増えてプロジェクトが複雑になってきた場合は、CMakeやMake、Ninjaなどのビルド関連ツールを活用すると、より管理しやすいC++開発環境を構築できます。

以上、VSCodeでC++をコンパイルする方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次