Visual C++ のコマンドラインを使ったプログラムのビルド方法

ここではマイクロソフトの C/C++ 言語開発環境である、Visual C++ のコマンドを使ってプログラムを構築する方法を紹介します。

Visual C++ といっても、グラフィカルユーザーインターフェイスのある統合開発環境 (IDE) を使いますよ、ということではなくて、 Visual C++ といったときに付属するコンパイラやリンカーなどの使い方を紹介します。

ここでは Visual C++ はあらかじめインストールされているものとします。

基本的なプログラムのビルドと実行

次のソースコードを test1.cpp として保存します。

Visual C++ では C 言語としてコンパイルしたい時は、ファイルの拡張子を .c とします。 また C++ としてコンパイルしたい場合は .cpp です。

#include <stdio.h>

void main() {
	printf("Hello!\n");	
}

このプログラムを実行しましょう。

Visual C++ の C コンパイラは cl コマンドです。 コンパイルするには cl コマンドにソースコード名 (ここでは test1.cpp) を渡します。

コマンド例は次の通り。

> cl test1.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 16.00.40219.01 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

test1.cpp
Microsoft (R) Incremental Linker Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:test1.exe
test1.obj
>

問題がなければ test1.exe という実行可能ファイルが作成されるはずです。

>test1.exe
Hello! ← プログラムの実行結果

いかがでしょうか。簡単ですね。

ではもう少し踏み込んでみましょう。

複数のソースコードからプログラムを作る

それでは複数のソースコードからプログラムを構築する方法をみていきましょう。

まず test1.cpp を次のように変更します。

#include "foo.h"

void main() {
	foo();
}

ここで参照している foo.h は次の通りです。

#pragma once

void foo();

foo 関数を実際に実装するファイルは foo.cpp とします。

関数を自分で作る時のステップは基本的に、関数を「宣言」してから「実装」します。「宣言」というのは「どんな引数を受け取って、どんな値を返すのか」記述することです。 通常はヘッダーファイル内にまとめて書きます。「実装」というのは関数の中身の処理を記述することです。

#include <stdio.h>

void foo() {
	printf("Hello, foo!\n");
}

foo.h で宣言され foo.cpp で実装している foo 関数を、 test1.cpp から利用しています。 このような場合、どのようにビルドすればよいでしょうか。

実は次のようにソースコードを並べて、cl に渡すだけで OK です。

>cl test1.cpp foo.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 16.00.40219.01 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

test1.cpp
foo.cpp
Generating Code...
Microsoft (R) Incremental Linker Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:test1.exe
test1.obj
foo.obj

>

*.cpp ファイルをコンパイルして、その結果の中間オブジェクトファイルを自動的にリンクして、プログラムをビルドしてくれます。

実行可能ファイル名 (exe の名前) はデフォルトで最初のソースコード名 (ここでは test1) と同一になります。

必要なもののみリコンパイルする

上記のようにソースコードを分割したとき、片側だけ再コンパイルが必要な場合もあります。

このような場合はどうしたらよいでしょうか。

具体例としては、foo を利用する test1.cpp には全く変更がなく、 foo 関数のみ変更があるような場合です。 このような場合、全てをコンパイルしなおすのは無駄です。必要な箇所のみ再コンパイルしたいものです。

Visual C++ コンパイラの /c オプションをセットすると、コンパイルのみ行いリンカを起動しません。 そこで次のように変更のあったソースコードのみコンパイルしなおして、オブジェクトファイルを作り直せば OK です。

>cl /c foo.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 16.00.40219.01 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

foo.cpp

>link test1.obj foo.obj
Microsoft (R) Incremental Linker Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.


>test1
Hello, world!

リンカである link コマンドは中間オブジェクトファイルから実行可能ファイルを作ります。 ここでは最初のビルド時に作成された test1.obj と、ここで再コンパイルして作られた foo.obj から実行可能ファイルを作り直しています。