Visual C++ による Windows プログラムのコンパイル方法

1. 準備 ~ test.cpp の作成

この資料の準備として、次のコードを test.cpp という名前で保存してください。

この資料では C:\temp ディレクトリに test.cpp を保存したことを想定して説明します。C:\temp 以外のパスにファイルを保存した場合は、パスを読み替えてください。

#include <windows.h>
#include <lmcons.h>
#include <tchar.h>
#include <stdio.h>

int main(int argc, LPTSTR argv[]) {

        TCHAR szUserName[UNLEN + 1];
        DWORD dwUNLen = UNLEN;

        if( !GetUserName( (LPTSTR) szUserName, &dwUNLen ) ) {
                printf("Error: %u", GetLastError() );
                return 1;
        }

        _tprintf( TEXT("%s\n"), szUserName );

        return 0;
}

上記を例にとったのは単にコードが短いからです(苦笑)

今回はプログラムのコンパイル方法にフォーカスしていますので、内容については深く考えないで結構です。 現在のユーザー名を表示するだけです。

このソースがコンパイルできたら、今回の目標は達成となります。

2. コンパイルとは?

用語の説明を簡単にしておきます。

「コンパイル」とは何でしょうか?

コンパイルは、「ソース・コードから、同じ意味の機械語のオブジェクトファイルを作成する作業」 と思っていてください。

コンパイルという作業を行うプログラムを、「コンパイラ」といいます。

Visual C++ に付属するコンパイラは cl.exe というコマンドです。

結局実際に行う作業は、「コンパイラである cl.exe にソースコード (test.cpp) を読み込ませて、 オブジェクトファイル (test.obj) を作る作業」 ということになります。

3. test.cpp をコンパイルしよう!

test.cpp は windows.h という Windows API の基本となるヘッダファイルを読み込んでいることからもわかるように、れっきとした Windows プログラムです。

Windows プログラムを正常にコンパイルするためには、Windows SDK 付属のヘッダファイル群が必要です。

cl はコンパイル時にデフォルトで INCLUDE 環境変数で指定されたディレクトリを確認します。

デフォルトで SDK 内の Include ファイルパスが INCLUDE に設定されるので、cl.exe はコンパイル時に、 ヘッダーファイル群を探し当てることが出来ます。

※ 自分の環境で、環境変数を確認するためには、コマンドプロンプトの set コマンドが利用できます。

set コマンドの結果はたくさんあるので、以下のように findstr コマンドと共に使うと便利でしょう。

> set | findstr INCLUDE

それでは test.cpp をコンパイルしましょう。

次のステップでコンパイル可能なはずです。

Visual Studio Command Prompt を開く

Visual Studio Command Prompt は次の場所にあります。

Microsoft Visual Studio メニュー → Visual Studio Tools

C:\temp に移動

> cd /d C:\temp

ここで、/d オプションはドライブが異なっても移動できるようにするためのオプションです。

コンパイル

次のコマンドでコンパイルしてみましょう。

> cl /c test.cpp

以下の内容が表示され、test.obj が同じフォルダ内に作成されれば成功です。

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

test.cpp

ここでは /c オプションを指定しているのは、コンパイルとリンクを同時に行わずにコンパイルだけするようにするためです。

/c を指定しなければ、コンパイルとリンクを続けて行うことが可能です。

しかし、/c オプション無しで実行すると次のようにエラーが発生するはずです。

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

test.cpp
Microsoft (R) Incremental Linker Version 14.10.25019.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:test.exe
test.obj
test.obj : error LNK2019: unresolved external symbol __imp_GetUserNameA referenced in function main
test.exe : fatal error LNK1120: 1 unresolved externals

エラーメッセージは 「GetUserNameA というのが未解決です」という内容ですが、これについては後ほど説明します。

コンパイラ、リンカーそれぞれへのオプションを明確にするためにも、 本講座では、それぞれの処理を別々に行うことをお奨めします。

今回はコマンドラインからコンパイルを行いました。

しかし、これではまだ EXE ファイル (実行可能ファイル) が作成されておらず、プログラムを実行することができません。次の記事で説明します。

Visual C++ による Windows プログラムのリンク方法