【C言語】WindowsにC言語開発環境を構築する(WSL / gcc)

WSLを利用したWindowsでのC言語開発環境の構築手順

このページにはプロモーションが含まれています

このページでは、Windows にC言語開発環境を構築する手順について説明していきます。Windows PC さえあれば、今回紹介する環境は全て「無料」で構築することが可能です!

C言語開発環境

C言語では、主に下記のような手順で開発を行っていくことになります。

まず開発者は「エディタ」を利用してC言語でソースコードの記述を行います。

C言語で開発を進める手順1

そして、そのソースコードを「コンパイラ」でコンパイルします。コンパイラではソースコードのコンパイルが実施され、上手くコンパイルができればプログラム(実行可能ファイル)の生成が行われます。

C言語で開発を進める手順2

そして、開発者は生成されたプログラムを実行して動作確認を行います。ここでは、生成されたプログラムが自身の意図したように動作しているかどうかを確認します。

C言語で開発を進める手順3

プログラムにバグがあって意図したとおりに動作していなければ、エディタでソースコードの修正を行ってそのバグを取り除きます。修正後、再度プログラムを実行して動作確認を行います。プログラムは、こういった一連の流れを繰り返しながら開発していくことになります。コンパイルの有無等の差はありますが、こういった流れで開発を行うのはC言語だけでなく他の言語でも同様になります。

また、プログラムにバグがある場合に、そのバグを修正することを「デバッグ」と呼びます。デバッグを行う際には「デバッガ」があると便利で、このデバッガを利用することでプログラムを一行ずつ停止させながら実行したり(ステップ実行)、停止したタイミングの各変数の中身を確認したりすることができ、バグの原因調査が楽に行えるようになります。

プログラムのデバッグを行う様子

このような手順を行うにあたって、C言語開発環境を構築するために必要となるソフトウェア(アプリ)は下記の3つとなります。

  • エディタ
  • コンパイラ
  • デバッガ

要は、C言語のソースコードを記述するためのエディタが存在し、さらに、そのソースコードからプログラムを生成するためのコンパイラがあれば、C言語の開発環境としては最低限のものが揃うことになります。また、プログラムを効率的に開発する上でデバッガがあると便利です。

MEMO

厳密にいえば、コンパイラだけでなくリンカやアセンブラ等も必要になるのですが、このページではこれらも含めてコンパイラと呼ばせていただきます

構築するC言語開発環境

今回構築するC言語開発環境は下図のようなものになります。

構築する環境の説明図

エディタとしては「VSCode」を利用します。さらに、Windows の WSL 機能を利用して Windows 上で Linux が動作するようにし、その Linux にコンパイラ「gcc」とデバッガ「gdb」をインストールします。

さらに、VSCode から Linux に接続し、VSCode の拡張機能「C/C++」を利用して VSCode から Linux 上の gccgdb を実行してソースコードのコンパイルや実行・デバッグを行えるようにしていきます。

つまり、ソースコードの実装からコンパイル・デバッグまで全て Windows 上の VSCode から行えるようになります。

構成は複雑にも思えますが手順としては単純ですので安心してください。

スポンサーリンク

Linux 上にコンパイラをインストールする

今回構築する環境のポイントの1つは Linux を利用するという点になります。

WIndows には WSL という機能が存在し、WSL を利用すれば Windows 上で Linux を動作させることができます。そして、Linux にコンパイラ gcc とデバッガ gdb をインストールし、Linux 上でコンパイルやデバッグを実行できるようにしていきます。

Linux環境を用意し、さらにgccやgdbをインストールしてコンパイルやデバッグを実行可能とする様子

この環境を構築するためには WSL 上で Linux を動作させるための準備が必要となるのですが、これさえ準備できれば後は簡単にC言語の開発環境を用意することができます。

また、今回構築する環境の場合、実質 Linux 上でC言語の開発環境を構築することになるため、Linux 用に用意されたライブラリや機能を利用することができます。Linux 上でC言語を開発することを前提とした解説記事や参考書も多いため、それらを参考にしながらC言語の学習を進めることも可能です。逆に言うと Windows 用に用意されたライブラリや機能や利用できないため、これらを利用したい場合は別の方法で Windows 上に直接コンパイラを導入する必要があるので注意してください。

また、この環境のメリットには「Windows を汚さなくて良い」という点も挙げられます。Windows に直接コンパイラをインストールする際には Windows 内にコンパイラに必要なファイル群をインストールし、さらに Windows でコンパイラが動作するための設定等を行う必要があります。なので、Windows の様々な箇所にコンパイラを導入するための変更が行われることになります。今回紹介する環境の場合は、コンパイラ等を導入しても Windows 上で動作する Linux の仮想イメージのみが変更されることになるため、不要になった場合はそれをアンインストールしてやれば全てきれいに元通りにすることが可能です。

実は、私は最近 WIndows を購入したばかりで、Windows を綺麗にしておきたいため、この環境でC言語を開発するようにしています。

VSCode からコンパイル及び実行を行う

また、今回はエディターとして VSCode を導入し、VSCode から WSL 上の Linux に接続できる環境を構築していきます。さらに、VSCode に拡張機能 C/C++ をインストールすることで、Windows からソースコードの作成やコンパイル、さらにはプログラムの実行やデバッグ(ステップ実行など)まで行うことができるようになります。

VSCodeからLinuxのgccやgdbを実行する様子

前述のとおり、コンパイラやデバッガ、生成されるプログラムは Linux 向けのものとなりますが、Linux に接続して VSCode から Linux 上のコンパイラやデバッガからのプログラムを実行できるようにすることで、Windows からの操作でC言語でのプログラム開発に必要な手順が行えるようになります。

VSCode は単なるエディタではあるのですが、拡張機能をインストールすることでエディタ以外の機能を追加することが可能です。今回は拡張機能 C/C++ をインストールしますが、これをインストールすることで VSCode からコンパイラやデバッガを実行可能となります。ただし、拡張機能 C/C++ は既にインストール済みのコンパイラやデバッガを利用するためのものとなりますので、コンパイラやデバッガに関しては別途インストールを行う必要があります。そして、前述の通り、今回はこれらを Linux にインストールしていくことになります。

C言語開発環境の構築手順

次は、先ほど紹介したような開発環境の構築手順を説明していきたいと思います。

スポンサーリンク

WSL と Ubuntu のインストール

まず、WSL をインストールし、さらに WSL 上で動作する Linux (ディストリビューション) をインストールする必要があります。今回はディストリビューションとしては Ubuntu を利用したいと思います。

WSLとLinuxの環境を用意する様子

この手順に関しては下記ページで紹介していますので、手順の詳細に関しては下記ページを参考にしていただければと思います。

【Windows】WindowsにWSLを導入する

コンパイラとデバッガのインストール

続いて、Ubuntu にコンパイラとデバッガをインストールしていきます。コンパイラとしては gcc、デバッガとしては gdb をインストールします。

gccとgdbをインストールする様子

gcc のインストール

最初に gccをインストールしていきます。

まず Ubuntu を起動し(起動方法は上記で紹介したページに記載しています)、続いて下記のコマンドを実行します。

$ sudo apt install build-essential

上記コマンドの実行により、gcc がインストールされることになります。gcc だけでなく C言語でのプログラム開発に便利な make などもインストールされることになります。

上記のコマンドが完了した後は、下記のように gcc コマンドを実行してみてください。バージョン情報が表示されれば gcc のインストールは完了していることになります。

$ gcc --version
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

gdb のインストール

続いて gdb をインストールします。この gdb に関しても gcc 同様にコマンド1つでインストール可能です。

ということで、下記コマンドを実行してみてください。

$ sudo apt install gdb

コマンドが完了したら、次は下記のコマンドで gdb のバージョンを確認してみましょう。バージョンが表示されていれば gdb のインストールは完了していることになります。

$ gdb --version
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gccgdb の動作確認

実は、上記の2つのコマンドの実行によって既にC言語の開発環境は構築できていることになります。

少し寄り道にはなりますが、先ほどインストールした gccgdb の動作確認のため、ここで実際にC言語でプログラムを作成し、デバッガーでプログラムのステップ実行を試してみましょう。最終的には、ここで行う手順を Windows の VSCode で行えるようにしていきます。

最初に行うのはC言語のソースコードの用意になります。ソースコードのファイル名やソースコードの内容は何でもよいのですが、ここでは初めてC言語を利用する方にも分かりやすいように、具体的な例を挙げながら説明していきます。

まず、Windows のデスクトップに work フォルダを作成し、その中に sample.c という名前のファイルを新規作成します(拡張子が .c になるようにしてください)。そして、このファイルの中身を下記のように変更してください。ここでは、ファイルはメモ帳等で編集していただければ良いです。

sample.c
#include <stdio.h>

int main(void) {
    int a;
    int b;
    int ans;

    a = 10;
    b = 5;
    ans = a * b;

    printf("ans = %d\n", ans);
}

続いて、先ほど作成した work フォルダ内で shift キーを押しながら右クリックしてみてください。そうするとメニューに Linux シェルをここに開く が表示されるはずなので、これをクリックします。

右クリックメニューからLinuxを起動する様子

これにより、work フォルダで Linux シェルが開くことになります。ここで下記コマンドを実行してみてください。

$ ls
sample.c

ls は作業フォルダにあるファイルをリストアップするコマンドになります。このコマンド実行によって、先ほど作成した sample.c が存在することが確認できればソースコードの準備は OK です。

ちなみに、作業フォルダとは簡単に言えば「現在開いているフォルダ」のことです。今の場合は work フォルダが作業フォルダとなります。また、作業フォルダはパスとして ./ で表すこともできます。

続いて下記コマンドを実行します。これにより、作業フォルダの中にある sample.cgcc によってコンパイルされ、作業フォルダに sample という名前のプログラムが生成されることになります。-g はデバッグ情報を生成するためのもので、これを生成しておくことで gdb によってステップ実行することが可能となります。

$ gcc ./sample.c -g -o ./sample

続いて下記コマンドを実行して先ほどのコンパイルで生成されたプログラムの実行を行います。ここで行うのはステップ実行ではなく通常のプログラム実行となります。

$ ./sample
ans = 50

上記のように ans = 50 が表示されれば、プログラムの実行結果として OK です。

ここまでの確認により、すでに Linux 上でC言語のソースコードをコンパイルし、コンパイルして生成されたプログラムが実行できる環境が構築できていることが確認できたことになります。

続いて gdb を利用してプログラムのステップ実行を行っていきます。

まず、下記コマンドを実行してください。

$ gdb sample
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from sample...
(gdb)

上記コマンド実行後、最後に (gdb) が表示され、ここでキー入力できるようになっていれば OK です。

ここでは gdb のコマンド受付が行われるようになっていますので、まず下記コマンドを実行して main 関数に対してブレークポイントを設定します。ブレークポイントとはプログラムを停止する位置を示すもので、下記コマンドを実行すれば、その後に gdb からプログラムを実行した際に main 関数が呼び出されたタイミングでプログラムが停止することになります。

(gdb) b main
Breakpoint 1 at 0x1155: file sample.c, line 8.

次に、下記のように r を実行します。これにより gdb からプログラムが実行されることになります。そして、先ほど main 関数に対してブレークポイントを設定したため、main 関数で最初に行われる処理の行でプログラムが停止することになります。sample.cmain において、処理として最初に存在するのは a = 10; となるため、a = 10; の行が実行される直前でプログラムが停止します(それ以前に行っているのは変数宣言のみ)。

(gdb) r
Starting program: /mnt/c/Users/daeud/OneDrive/デスクトップ/work/sample
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main () at sample.c:8
8           a = 10;
(gdb)

ここで n を実行すれば、プログラムが1行分のみ進んでまた停止することになります。

(gdb) n
9           b = 5;
(gdb)

再度 n を実行すれば、またプログラムが1行分のみ進んで停止することになります。

(gdb) n
10          ans = a * b;
(gdb)

こんな感じでプログラムを1行停止させながら実行することをステップ実行と呼びます。そして、上記のような動作が確認できれば gdb も上手く動作していると考えてよいでしょう。ということで、最後に quit を実行して gdb を終了させましょう。

(gdb) quit
A debugging session is active.

        Inferior 1 [process 2447] will be killed.

Quit anyway? (y or n) y
$

次の節からは、ここで行ったことを Windows の VSCode から実行できるように環境構築するための手順を示していきます。コマンド実行が多かったのでコマンドに慣れていない方には苦痛だったかもしれませんが、次の節で説明する環境が構築できればコマンド不要でコンパイルやステップ実行もできるようになります。

VSCode のインストールと拡張機能の導入

では、次は Windows 側に VSCode をインストールし、C言語開発に必要な拡張機能(プラグイン)を VSCode にインストールしていきます。

VSCodeと拡張機能をインストールする様子

VSCode はエディタであり、今回構築する開発環境においては、この VSCode を利用してC言語のソースコードの記述を行っていくことになります。また、VSCode に拡張機能を導入することで、先ほどインストールした gccgdb 等を VSCode から実行することが出来るようになります。

VSCode のインストール

まずは WIndows に VSCode をインストールしていきます。

VSCode のインストーラーは下記のページからダウンロード可能です。

https://code.visualstudio.com/download

このページをウェブブラウザで開くと下図のようなページが表示されると思いますので、オレンジ枠で囲った部分をクリックして Windows 用のインストーラーをダウンロードします。

VSCodeのインストーラーのダウンロード手順

おそらくダウンロードフォルダ内にインストーラーがダウンロードされることになりますので、ダウンロード完了後にインストーラーのアイコンをダブルクリックして開きます。

そうするとインストーラーが起動します。最初に使用許諾契約書への同意が求められますので、内容に問題なければ「同意する」にチェックをつけて「次へ」ボタンをクリックします。

VSCodeのインストール手順1

続いて VSCode のインストール先の設定画面が表示されますので、インストール先を指定して「次へ」ボタンをクリックします。特に問題がなければデフォルト設定のまま進んでよいと思います。同様に、以降も自身の好みに合わせて設定していけばよいです。

VSCodeのインストール手順2

ただ、個人的には、下図の設定においては「エクスプローラーのファイルコンテキストメニューに[Codeで開く]アクションを追加する」と「エクスプローラーのディレクトリコンテキストメニューに[Codeで開く]アクションを追加する」にはチェックをつけて有効化しておくことをオススメします。これにより、ファイルやフォルダを直接 shift キー + 右クリックして表示されるメニューから VSCode で開けるようになります。

VSCodeのインストール手順3

インストールを進めていけば最終的に下の図のようなウィンドウが表示され、VS Codeのインストールが完了します。「Visual Studio Codeを実行する」にチェックをつけたまま「完了」ボタンをクリックすれば VSCode が開くはずです。

VSCodeのインストール手順4

日本語化

次は VSCode の日本語化を行っていきます。VSCode の日本語化は拡張機能のインストールにより行うことができます。この手順は必須ではないですが、以降の手順の説明は日本語化した VSCode に基づいて説明をしていきますので注意してください。

まず、拡張機能のインストールを行うために、ウィンドウ左側にあるメニューから下の図のオレンジ枠で示す Extentions を選択してください。

VSCodeの日本語化手順1

Extentions を選択すればウィンドウの左上部分に検索バーが表示されますので、そこに japanese と入力します。これにより、検索結果として VSCode 日本語化拡張機能の「Japanese Language Pack for Visual Studio Code」が見つかるはずなので、その拡張機能の install ボタンをクリックします。

VSCodeの日本語化手順2

しばらく時間がたてばインストールが完了します。おそらくインストールが完了したら下の図のようなポップアップが表示されるので、このポップアップの Change Language And Restart ボタンをクリックして VSCode を再起動します(インストール完了後にポップアップが表示されない場合は手動で VSCode を再起動してください)。この再起動によって、先ほどインストールした拡張機能が反映され、VSCode のウィンドウに表示される文字列が日本語表記に切り替わることになります。

VSCodeの日本語化手順3

Linux への接続

次は、VSCode から Linux への接続を行っていきます。コンパイラは Linux 側にインストールしているのに対し、VSCode は Windows 側にインストールしているため、現状 VSCode からC言語ソースコードのコンパイルが実行できない状態になっています。

ですが、VSCode から Linux に接続し、VSCode から接続先の Linux にインストールされているコンパイラを利用できるようにしていけば、Windows にインストールした VSCode からコンパイルが実行できるようになります。

そのため、まずは VSCode から「WSL 上で動作する Linux」に接続できる環境を構築していきます。

手順としては単純で、まず VSCode のウィンドウの左下にある下図のボタンをクリックします。

WSLに接続する手順1

すると、ウィンドウ上部に下図のようなメニューが表示されますので、ここで WSL を選択します。これにより、VSCode に WSL に接続するための拡張機能が自動的にインストールされ、さらに VSCode から「WSL 上で動作する Linux」への接続が行われます。

Linuxへの接続手順1

おそらく、初めて接続する場合は時間がかかると思います。これは、接続先の Linux で様々な設定やインストールが行われるからになります。待っていれば、ウィンドウ左下のアイコンの表記が下の図のように「接続先の Linux ディストリビューションの名前」に変化すると思います。これで Linux への接続は完了です!

WSLへの接続が完了してアイコンにディストリビューション名が表示される様子

ちなみに、先程の操作手順を実行した場合、WSL 上で動作する Linuxとして「既定のディストリビューションに選択されている Linux」への接続が行われることになります。次回以降、他のディストリビューションに接続を行いたい場合は画面左下のアイコンクリック後に ディストリビューションを使用して WSL に接続 を選択し、さらに接続先とするディストリビューションを選択するようにしてください。

Linuxへの接続手順2

C/C++ 拡張機能のインストール

次は、VSCode からコンパイラが実行できるように「C/C++」という拡張機能をインストールしていきます。

VSCode の日本語を行ったとき同様に、ウィンドウ左側のメニューから「拡張機能」を選択し、さらに検索バーに C を入力、検索結果としてリストアップされる C/C++ 拡張機能の インストール ボタンをクリックすれば「C/C++」拡張機能のインストールが行われます。

C/C++拡張機能のインストール

以上により、C言語を開発する環境を構築するために最低限必要な拡張機能のインストールが完了したことになります。

一点補足しておくと、ここまで示してきた手順では Linux に接続した後に「C/C++」拡張機能をインストールするため、Linux 用の「C/C++」拡張機能がインストールされることになります。したがって、Linux 上のコンパイラやデバッガを VSCode から実行することができるようになりますが、Windows 用の「C/C++」拡張機能はインストールされていないため、Windows にインストールされているコンパイラやデバッガは VSCode からは利用できないようになっているので注意してください。

Windows 側にインストールされているコンパイラやデバッガを利用するようにするためには、Linux への接続を行なっていない状態で「C/C++」拡張機能をインストールする必要があります。

スポンサーリンク

コンパイルの実行とプログラムの実行

次は、VSCode からC言語ソースコードのコンパイルや、コンパイルによって生成されたプログラムをデバッガを利用して実行する手順について説明していきます。せっかくなので、gcc と gdb の動作確認gccgdb の動作確認に使用したソースコードを例にして手順を説明していきたいと思います。

gcc と gdb の動作確認 での説明内容をおさらいしておくと、ここでは下記の5つの手順を実施しました。結局やることは VSCode でも同じです。今回はソースコード自体は既に用意していますし、ソースコードの作成は単純に VSCode でソースコードを記述すれば良いだけになりますので、下側の4つに対してのみ VSCode から実施するための手順を説明していきます。

  • C言語ソースコードを作成する
  • ソースコードの存在する「フォルダを開く」
  • ソースコードを gcc でコンパイルする
  • 停止させたい箇所にブレークポイントを設定する
  • 生成されたプログラムを gdb から実行する

フォルダを開く

まず、コンパイル対象となるC言語ソースコードの存在するフォルダを VSCode から開きます。

VSCodeからフォルダを開く様子

そのために、画面左上にある ファイル メニュー から フォルダーを開く を選択してください。これにより、VSCode にフォルダ選択ウィンドウが表示され、フォルダのパスが入力できるようになります。ここで入力したパスのフォルダが VSCode で開かれ、そのフォルダ以下のファイルの編集等が VSCode から行えるようになります。

フォルダを開く手順

ここで、gcc と gdb の動作確認 で作成した work フォルダのパスを入力していきます。注意点は、現在 VSCode から Linux に接続しているため、ここでは Linux 上のパスを入力する必要があるという点になります。つまり、Linux 上での work フォルダのパスを入力する必要があります。

WSL 上で動作する Linux では /mnt/ 以下に Windows のドライブがマウントされており、ここから Windows の各ドライブ内に存在するフォルダやファイルにアクセスできるようになっています。なので、まずはフォルダのパスの入力欄を全て消し、/mnt/ と入力します。そうすれば、Windows のドライブが選択肢として表示されるはずです。

フォルダを開く手順1

この選択肢から、まずは work フォルダが存在するドライブを選択します。基本的にCドライブに該当する c を選択すれば良いと思うのですが、PC によって異なる可能性もあるので注意してください。私の PC にはCドライブしか存在しませんし、Cドライブのデスクトップに work フォルダを作成したため c を選択しています。ドライブを選択すれば、次はドライブ直下に存在するフォルダが選択肢として表示されます。

フォルダを開く手順2

このように、選択肢を選択すれば、次の階層に存在するフォルダが選択肢として表示されるようになっているため、これを繰り返して最終的に gcc と gdb の動作確認 で作成した work フォルダが選択されるように手順を進めてください。基本的に、パスの区切りが¥マークからスラッシュに変化してはいるものの、/mnt/ 以下は Windows でのフォルダパスと同様のものになるはずです。パスの入力が完了すれば OK ボタンをクリックしてフォルダーを開きます。

フォルダを開く手順3

フォルダを開けばエクスプローラーが表示され、開いたフォルダの中に存在するファイルやフォルダの一覧がウィンドウ左側に表示されます。今回開いた work フォルダには sample.c が存在するはずで、この sample.c をクリックすれば sample.c の中身が表示され、編集等が可能であることも確認できるはずです。

フォルダが開かれた様子

ここまでの手順で、VSCode からフォルダを開き、そのフォルダ内に存在するファイルの編集が可能となったことになります。

tasks.json の作成

次は、tasks.json というファイルを作成していきます。

tasks.json とは、JSON 形式でタスクを記述するファイルとなります。このファイルを VSCode で開いたフォルダ直下の .vscode フォルダの中に設置しておけば、VSCode のメニュー等から tasks.json に記述したタスクを実行することが可能となります。ここでいう「タスク」とは、簡単にコマンド実行くらいに考えていただいて良いです。

今回 tasks.json に記述するタスクは、gcc と gdb の動作確認 でコンパイルを行う際に実行した下記コマンドに相当するものとなります。ただし、パスに関する部分は VSCode で表示中のファイルに自動的に設定されるように tasks.json を作成していきます。

$ gcc ./sample.c -g -o ./sample

前述のとおり、tasks.json は VSCode で開いたフォルダ直下の .vscode に設置しておく必要がありますが、現状 .vscode フォルダが存在しないため、まずは .vscode フォルダを作成します。

フォルダの作成は、エクスプローラのスペース部分、例えば sample.c の下側で右クリックを行い、表示されるメニューから 新しいフォルダー を選択することで行えます。

.vscodeフォルダの作成

新しいフォルダー を選択するとフォルダが新規作成され、そのフォルダの名前の入力を受け付けるようになっているため、ここで .vscode と名前を入力してください。

これで .vscode フォルダが作成できましたので、次はこのフォルダの中に tasks.json を作成していきます。

そのために、まずは先ほど作成された .vscode フォルダを右クリックし、今度は 新しいファイル を選択してください。そして、作成されたファイルの名前を tasks.json と名付けます。

さらに、この tasks.json をクリックしてください。そうすると、ウィンドウ右側に tasks.json の編集画面が表示されます。現状は、ファイルを新規作成した直後の状態なので中身は空だと思います。

次は、このウィンドウに下記を丸々コピペしてください。コピペ後は ファイル メニューからファイルの保存を行ってください。

tasks.json
{
    // tasks.json 形式の詳細についての資料は、
    // https://go.microsoft.com/fwlink/?LinkId=733558 をご覧ください
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "c_build",
            "command": "gcc",
            "args": [
                "${file}",
                "-g",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group": "build"
        }
    ]
}

この tasks.json では "tasks": [] の中に複数のタスクを定義することが可能です。"label" がタスクの名前を示しており、上記で定義しているタスクの名前は c_build となります。

そして、このタスクでは "command" に指定したコマンドが "args" の引数を指定した状態で実行されることになります。つまり、このタスクを実行すれば下記のコマンドが実行されます。

$ gcc ${file} -g -o {fileDirname}/${fileBasenameNoExtension}

${file}${fileDirname}${fileBasenameNoExtension} は変数で、VSCode で表示中のファイルに応じて下記のようなものがそれぞれ自動的にセットされるようになっています。

  • ${file}:VSCode で開いているフォルダから見たパス
  • ${fileDirname}:VSCodeで開いているフォルダから見たパス(ファイル名なし)
  • ${fileBasenameNoExtension}:拡張子なしのファイル名

したがって、sample.c を開いた状態で上記のタスクを実行すれば、次のようなコマンドが実行されることになります。

$ gcc ./sample.c -g -o ./sample

これは gcc と gdb の動作確認sample.c をコンパイルした時と同じコマンドとなります。変数部分は VSCode で表示しているファイルに応じて適切にセットされるようになっているため、上記のタスク c_build を実行すれば、VSCode で表示しているファイルがコンパイルされることになります。

launch.json の作成

次は launch.json を作成していきます。launch.json はデバッグの構成を記述する設定ファイルになります。

このファイルも tasks.json と同様に .vscode フォルダの下に作成する必要があります。

ということで、launch.json.vscode フォルダの下に作成し、VSCode で開いて下記を丸々コピペして保存してください。

launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 起動",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "gdb の再フォーマットを有効にする",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "逆アセンブリ フレーバーを Intel に設定",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "c_build"
        }
    ]
}

いくつかポイントを説明しておきます。

launch.json においては、"configurations" [] に複数のデバッグの構成を記述することができます。その構成の名前は "name" キーで指定することができます。

また、"request" はデバッグの仕方を指定するキーとなっており、"launch" を指定すれば、 "program" で指定したプログラムをデバッガから起動してデバッグを開始することができます。上記では "program" には、tasks.jsonc_build で gcc-o オプションに指定したパスと同じものを指定しているため、この構成でデバッグを開始すれば c_build タスクを実行して生成されたプログラムがデバッガから起動されることになります。

tasks.jsonで出力するファイルのパスとlaunch.jsonとで実行するプログラムのパスとが一致している様子

ちなみに、今回は紹介しませんが、"request""attach" を指定することで、すでに起動中のプログラムをデバッガから接続してデバッグするようなことも可能となります。

さらに、"MIMode""gdb" を指定しているため、デバッガとしては gdb が利用されることになります。

つまりは、sample.c を開いた状態で c_build のタスクを実行すればコンパイルが行われ、その後に (gdb) 起動 の構成でデバッグを開始すれば、gcc と gdb の動作確認samplegdb から起動したときと同様の手順が行われることになります。

ただ、デバッグを開始する前に毎回 c_build のタスクを手動で実行するのは面倒です。そのため、上記の launch.json では "preLaunchTask": "c_build" を指定するようにしています。"preLaunchTask" を設定することで、デバッグ開始前に自動的に実行するタスクを設定することができます。そして、それに c_build を指定しているため、デバッグを開始する前に tasks.jsonc_build が自動的に実行されるようになります。

つまり、実行したいプログラムのソースコードを VSCode で表示した状態で (gdb) 起動 の構成でデバッグを開始すれば、まず、開いているソースコードに対して gcc によってコンパイルが実行されて "${fileDirname}/${fileBasenameNoExtension}" にプログラムが生成されます。そして、その後に gdb が  "${fileDirname}/${fileBasenameNoExtension}" を起動し、その後ステップ実行が行えるようになります。

ということで、ここで作成した tasks.jsonlaunch.json により、VSCode で表示中のソースコードに対して gcc でコンパイルを行い、生成されたプログラムを gdb で実行する環境が整ったことになります。

プログラムのステップ実行(デバッグ)

続いて、gcc と gdb の動作確認 でも行ったようなプログラムのステップ実行を実施していきたいと思います。

ブレークポイントの設定

gcc と gdb の動作確認 でも行ったように、ステップ実行を行うためにはまずプログラムを停止させる必要があります。これは、停止させたい箇所にブレークポイントを設定して gdb からプログラムを実行することで実現できます。gcc と gdb の動作確認 では gdb でコマンドを実行することでブレークポイントの設定を行いましたが、VSCode ではもっと簡単にブレークポイントを設定することができます。

その具体的な方法とは、VSCode でソースコードを表示し、停止させたい行の行番号の左側をクリックするだけになります。クリックすれば赤丸が表示されるようになり、そこがブレークポイントとなります。このブレークポイントは複数個所に設定することが可能です。

ブレークポイントの設定

例えば上の図においては sample.c の 8 行目にブレークポイントを設定しています。そのため、gdb からプログラムを実行した場合、8 行目が実行される直前、すなわち a = 10 が実行される直前でプログラムが停止します。

ステップ実行

ブレークポイントを設定したら、次は実際にステップ実行を行ってみましょう!

まず、sample.c を表示した状態のまま、ウィンドウ左側のメニューの「実行とデバッグ」ボタンをクリックします(再生アイコンと虫マークが表示されているボタン)。すると「実行とデバッグ」ウィンドウが開かれ、上側にデバッグの構成の選択メニューが表示されます。ここでは launch.json で定義した「デバッグの構成」の選択を行うことができます。現状、構成としては (gdb) 起動 の1つしか定義していないため、おそらくデフォルトで (gdb) 起動 が選択されているはずです。

ステップ実行の手順1

つづいて、この構成名の左側にある「再生ボタン」をクリックします。そうすると、この構成、すなわち (gdb) 起動 の構成に基づいてデバッグが開始されることになります。が、(gdb) 起動 では "preLaunchTask": "c_build" を指定しているため、デバッグが始まる前に c_build が実行され、gcc による sample.c のコンパイルが実行されることになります。

このコンパイルに失敗した場合は、その時点でエラーが発生してデバッグが中止されることになります。コンパイルに成功した場合はプログラムが生成され、次は gdb によってプログラムが起動されることになります。

さらに、今回はブレークポイントを設定しているため、プログラム起動後に gdb によってプログラムがブレークポイントで停止することになります。停止すると、下の図のようにソースコード上の実行直前の行が黄色でハイライトされることになります。さらに、ウィンドウ左側に停止した時点の変数の中身(オレンジ枠内)やコールスタック(青枠内)等が表示されます。

ステップ実行の手順2

また、ピンク枠で囲っている部分はデバッグの操作バーとなります。

この操作バーでは下図で示すような6つの操作を行うことが可能です。

操作バー

各種操作の詳細は下記のとおりです。

  • 続行:プログラムを次のブレークポイントまで進める
  • ステップオーバー:1行だけプログラムを進める(関数はスキップする)
  • ステップイン:1行だけプログラムを進める(関数内に入り込む)
  • ステップアウト:今実行中の関数が終了するまでプログラムを進める
  • 再起動:プログラムを再度最初から実行する
  • 停止:デバッグを終了する

例えば、今の状態で ステップオーバー ボタンをクリックすれば、プログラムが1行だけ進んで a = 10 が実行されることになります。ボタンクリック後に変数の中身を確認すれば、a の値が 10 に変化していることも確認できるはずです。

ステップ実行の手順3

こんな感じでプログラムを1行ずつ実行しながら変数の中身の変化を確認するようなことも可能で、これを利用することでプログラムがうまく動作しない場合にどの行で意図しない動作になっているのかを確認していくことができます。プログラムを開発していると、プログラムが自身の意図した動作をしてくれないことも多く、その原因究明が必要になることが多いです。そんな時でも、このステップ実行を利用すれば、どの行で自身の意図した動作になっていないのかを簡単に突きとめることが出来るようになります。

ただ、ソースコードの規模が大きい場合、毎回1行ずつプログラムを実行すると、その原因究明に必要な時間も多くなります。なので、適当な位置にブレークポイントを設定し、続行 ボタンや ステップアウト ボタン等を上手く利用して効率的に原因調査を行うことも必要になります。このあたりのボタンの違いはデバッグ等を行っていけば自然と理解していけると思います。

また、先ほどは ステップオーバー ボタンをクリックしましたが、次に実行する行が関数呼び出しである場合、ステップイン ボタンをクリックすることで、その関数内部に入り込んで1行ずつプログラムを実行していくようなことも可能になります。

では、sample.c で呼び出している printf 関数の中に入り込んでプログラムを1行ずつ実行するようなことが可能であるかというと、そういうわけではありません。基本的には、自身で実装したソースコードのプログラム部分のみがステップ実行可能であると考えてよいです。

こういったステップ実行を行うためには、コンパイル時にデバッグ情報を生成することと、VSCode 上に表示するソースコードが必要になります。printf 関数はC言語の標準ライブラリで定義される関数で、ソースコードも無いしデバッグ情報も生成されていないためステップ実行は行えません。そのため、printf 関数を実行する行で ステップイン ボタンをクリックしても関数内部には入り込まず、次の行までプログラムが進んでしまうことになります。

逆に言えば、ソースコードを入手し、自身でコンパイル時にデバッグ情報を生成するようにしてやればどんなプログラムでもステップ実行できるようになります。例えば、Python にはC言語で開発されているものもあるため、Python のソースコードを入手して自分でデバッグ情報が生成されるようにコンパイルしてやれば Python インタプリタをステップ実行するようなことも可能です。これに関しての詳細は下記ページで説明していますので、詳しくは下記ページを参照してください。

Python本体をステップ実行する方法の解説ページアイキャッチ Python 本体をステップ実行する方法(VSCode)

説明がちょっと横道に逸れてしまいましたが、現状はまだプログラムのデバッグ最中です。デバッグはプログラムを最後まで進めれば自動的に終了します。また、途中でデバッグを終了させたければ 停止 ボタンをクリックしてやればよいです。今回はとりあえず 続行 ボタンをクリックしてやればプログラムが最後まで進んでデバッグが終了するはずです。

他のフォルダやファイルでの開発

以上で、VSCode からC言語で開発を行う環境が整ったことになります!

ここまで sample.c のみで開発環境の動作確認を行いましたが、このページで紹介した開発環境が構築できれば、今 VSCode で開いているフォルダの中に新規作成した他のC言語のソースファイルに対してもコンパイルやデバッグを VSCode から実施することができます。また、VSCode で開いているフォルダの中に新規フォルダを作成し、そのフォルダの中に作成したソースコードファイルに対しても同様にコンパイルやデバッグを VSCode から実施可能です。

sample.c以外のファイルもコンパイル・デバッグ実行可能であることを示す図

これは tasks.jsonlaunch.json をそういうことが出来るように作成しているためで、より具体的には、これらのファイルの中では変数(${file}${fileDirname} など)を使用しており、ファイル名やフォルダの構造の違いを吸収する形でコンパイルやデバッグ対象のファイルのパスが自動的に変化するようになっているからになります。ただし、コンパイル・デバッグ対象のソースコードを予め VSCode で表示してからデバッグを開始する必要がある点には注意してください。

また、現状 tasks.jsonlaunch.json が存在するのはデスクトップ上に作成した work フォルダ直下にある .vscode フォルダ内のみとなります。VSCode では開いたフォルダ直下にある .vscode フォルダ内の tasks.jsonlaunch.json に基づいてタスクやデバッグを実行するようになっているため、現状では work フォルダを VSCode を開いた時のみタスクやデバッグが実行可能であることになります。逆に言えば、VSCode で開いたフォルダ直下に今回作成した.vscode フォルダをそのままコピーしてやれば、今回試したようなタスクの実行(コンパイルの実行)とデバッグの実行が行えることになります。

したがって、今回デスクトップ上に作成した work フォルダ以外を VSCode から開いてC言語の開発を行いたい場合は、VSCode で開いたフォルダ直下に今回作成した .vscode フォルダをコピーしてやれば(もちろん tasks.jsonlaunch.json を含めて)、その開いたフォルダ内にあるC言語ソースコードファイルに対して今回同様のタスクの実行やデバッグの実行を行うことが出来るようになります。

C言語開発環境を構築するために.vscodeをコピーする様子

ということで、とりあえず今回作成した .vscode フォルダや tasks.jsonlaunch.json を使いまわしていただければC言語の開発環境としては一応成立すると思います。

ただ、今回作成した tasks.json では、VSCode で表示中のファイル1つのみをコンパイルするようにしていますので、分割コンパイルを行う際には tasks.json の変更が必要になります。また、コンパイル時のオプションを変更したいような場合も tasks.json の変更が必要になります。

このような場合、基本的にはコマンド実行でコンパイルを行う際に gcc に指定する引数を args に設定するように tasks.json を変更してやればよいです。 例えば、コンパイル時のオプションに -lpthread を追加したいのであれば tasks.json を下記のように変更すればよいことになります。

tasks.jsonの変更例
{
    // tasks.json 形式の詳細についての資料は、
    // https://go.microsoft.com/fwlink/?LinkId=733558 をご覧ください
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "c_build",
            "command": "gcc",
            "args": [
                "${file}",
                "-g",
                "-lpthread",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group": "build"
        }
    ]
}

また、"command""gcc" を指定しているため、タスクを実行すれば gcc によるコンパイルが実行されることになりますが、"command""make" を指定すれば make コマンドが実行されて Makefile に基づいてコンパイル等が行われるようになります。そのため、Makefile さえ用意すれば分割コンパイル等の複雑なコンパイルもタスクの実行で実現することが出来るようになります。そして、launch.json"preLaunchTask" を利用すれば、そのタスクがデバッグ開始時に自動的に実行されるようになって便利です。

こんな感じで、tasks.json の変更により、様々なコンパイルも実現できるようになりますので、必要に応じて tasks.json の変更にも挑戦してみていただければと思います!

スポンサーリンク

まとめ

このページでは、Windows にC言語開発環境を構築する手順について説明しました!

おさらいしておくと、下図のような構成の開発環境を準備し、Windwos の VSCode からC言語が開発できる環境の構築を行いました。

構築する環境の説明図

“Windows に” と言いながら細かく言うとコンパイラやデバッガは Linux 上にインストールしていますが、Windows から開発が行えるという点で Windows に開発環境が構築できたと考えてよいと思います。この手順だと、準備に手間のかかるコンパイラやデバッガのインストールもコマンドを数回実行するだけで実現することが可能で楽に構築できたのではないかと思います。

これらが用意できれば、あとは Windows の VSCode からコンパイラやデバッガを利用するようにすればよいだけで、このあたりも拡張機能の利用や .json ファイルのコピペで完結するのでそこまで大変ではなかったのではないかと思います。

特にプログラミング初心者の方はデバッグするのに心が折れてプログラミングに挫折する方も多いと思いますが、今回構築した開発環境を利用すればプログラムを1行ずつ実行することが出来てデバッグも楽に行うことが出来ると思います!

是非今回構築した開発環境を利用してC言語の学習やプログラミングを楽しんでいただければと思います!

同じカテゴリのページ一覧を表示