複数ファイルからなるC++プログラムをVSCodeで実行する手順の備忘録

Visual Studio Codeで複数ファイルからなるプログラムをコンパイルする方法についてまとめられている記事がすぐに見つからなくて色々試したので、実行手順をこちらにまとめます。

VS Codeダウンロード

Visual Studio Codeの公式サイトから、使用しているOS(windowsやmacなど)にあったものをダウンロードします。

C++プログラム・コンパイル用拡張機能インストール

VSCodeでC++デバッグ(Windows)」を参考に

  • C/C++
  • CMake
  • CMake Tools

をインストールしました。

VScode拡張機能

1つのソースファイルのコンパイル

ファイルが1つの場合は、以下のようなファイルを作成して、右上のアイコンからコンパイル・デバッグができます。

#include <stdio.h>
#include <cmath>

#define PI 3.14159265358979
/* X座標を返す */
float X_coordinate(int r, int t)
{
    float theta=PI*t/180;
    float x=r*std::cos(theta);
    return x;
}

/* Y座標を返す */
float Y_coordinate(int r, int t)
{
    float theta=PI*t/180;
    float y=r*std::sin(theta);
    return y;
}

int main(void)
{
    int r = 50;
    int t = 90;

    printf( "X= %f\n", X_coordinate(r,t) );
    printf( "Y= %f\n", Y_coordinate(r,t) );
}

実際のプログラム実行やデバッグの画面は以下になります。

Visual Studio Codeのデバッグ画面
VScodeでデバッグ、プログラム実行は右上のアイコンから可能。
Visual Studio Codeのデバッグ画面
コンパイラはg++を選択します。(C++の場合)
Visual Studio Codeのプログラム実行画面
プログラムを実行した場合
Visual Studio Codeのデバッグ画面
プログラムをデバッグした場合。(ブレークポイントは行数の左をクリックして上図の赤丸のように設定できます)

複数ファイルからなるプログラムの例

main.cpp以外にも複数ファイルがある場合にはコンパイルを行う場合に、他のファイル(今回はcoordinate.cpp)も参照するように設定する必要があります。以下は今回用いた

  • main.cpp
  • coordinate.cpp
  • coordinate.h

のコードになります。極座標(半径r,角度θ)を直行座標(x,y)に変換する例です。

#include <stdio.h>
#include "coordinate.h"

int main(void)
{
    int r = 50;
    int t = 90;

    printf( "X= %f\n", X_coordinate(r,t) );
    printf( "Y= %f\n", Y_coordinate(r,t) );
}
/* X座標を返す */
float X_coordinate(int r, int t);

/* Y座標を返す */
float Y_coordinate(int r, int t);
#include <cmath>
#include "coordinate.h"

#define PI 3.14159265358979
/* X座標を返す */
float X_coordinate(int r, int t)
{
    float theta=PI*t/180;
    float x=r*std::cos(theta);
    return x;
}

/* Y座標を返す */
float Y_coordinate(int r, int t)
{
    float theta=PI*t/180;
    float y=r*std::sin(theta);
    return y;
}

複数ファイルからなるプログラムのコンパイル

ターミナルでコンパイルする方法(g++)

用いているソースファイル(main.cpp,coordinate.cpp)を指定して、実行プログラムmainを作成します。

$ g++ main.cpp coordinate.cpp -o main (あるいはg++ *.cpp -o main)
$ ./main
X= -0.000002
Y= 50.000000

tasks.jsonでコンパイルする方法

右上の三角アイコンを選択し、「Debug C/C++ File」「Run C/C++ File」を選択、デバッグ構成としてC/C++:g++ アクティブファイルのビルドとデバッグ(C++なのでコンパイラは/usr/bin/g++)を選択するとVScode用のビルドタスク設定ファイルtasks.jsonができます。

tasks.jsonでコンパイルするソースファイルを指定します。例えば以下のように${fileDirname}/*.cppをソースファイルとして指定すると、ディレクトリ内の.cppファイルを指定できます。

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ アクティブなファイルのビルド",
            "command": "/usr/bin/g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${fileDirname}/*.cpp", 
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "デバッガーによって生成されたタスク。"
        }
    ],
    "version": "2.0.0"
}
tasks.jsonの編集画面
tasks.jsonの編集画面

CMakeLists.txtを用いる方法

tasks.jsonはVScode用のファイルかと思いますが、一般にはCMakeLists.txtで設定します。ソースファイルの階層がある場合は各ディレクトリにCMakeLists.txtを置く必要がありますが、今回の

  • main.cpp
  • coordinate.cpp
  • coordinate.h

3つのファイルの場合には、同じディレクトリにCMakeLists.txtを作成すれば良いです。

# CMakeのバージョンを設定
cmake_minimum_required(VERSION 3.0.0)
# プロジェクト名と使用する言語を設定
project(debug VERSION 0.1.0)

# ファイルを検索し,変数「MY_SOURCE」に設定
file(GLOB MY_SOURCE src/*.h *.cpp)

# 上記で検索したMY_SOURCEから実行ファイルmainを作成
add_executable(main ${MY_SOURCE})
CMakeでのコンパイルでbuildディレクトリが生成される
コンパイル前(左)とコンパイル後(右)
CMakeでのコンパイルに用いるGUI画面

CMakelists.txtでのコンパイルは、私は画面の一番下にあるタブから実行することができました(上図参照)。①から③までのアイコンを操作してデバッグができます。(以下手順)

  1. デバッグの際には、途中の変数の値を全てチェックしたいのでDebugモードを選択します。(Releaseモードだと最適化が行われて途中の変数の値が見れなくなる場合があります。)
  2. Buildを実行するbuildディレクトリができて、その中に実行ファイル(今回はmain)が生成されます。
  3. debugは虫アイコンをクリックすればブレークポイントの位置で止まります。あとはステップ実行などしていきます。

画面右上のアイコンでデバッグした場合にはtasks.jsonが読まれ、画面下部のアイコンでデバッグするとCMakelists.txtが読み込まれます。

コメント

タイトルとURLをコピーしました