よく使うコンパイル・リンカオプション

前節のコンパイルとリンク方法では非常に基本的なビルド方法について解説しました。

ここではもう一歩進んで、便利なコンパイル・リンカオプションを紹介します。

コンパイルオプションを変更することによって、出力されるコードを最適化したり、 Unicode ビルドを作ったりします。

よく使うオプションには次のものがあります。

  • 最適化オプション (/O1 コンパイラオプション)
  • 警告レベルの指定 (/W<警告レベル> コンパイラオプション)
  • Unicode ビルド (/DUNICODE, /D_UNICODE)
  • デバッグ情報の生成
  • ターゲット Windows バージョン指定

最適化オプション

コードサイズの最適化を実施することで、可能な限りコードサイズを小さくすることが出来ます。 オプションは /O1 オプションです。

ここでいうコードサイズというのは、もちろんソースコードのサイズではなく、生成されるオブジェクトファイルのサイズです。 オブジェクトファイルが小さくなれば、最終的な実行可能ファイルのサイズも小さくなります。

警告レベルの指定

より望ましいコーディングができることをコンパイラが検出した場合、それを警告として出力させることができます。 /W4 オプションを指定してコンパイルすればよいでしょう。

Unicode ビルド

コンパイラオプションとして /DUNICODE と /D_UNICODE を渡すことにより、 Win32 API 及び CRT ライブラリ関数のワイドキャラクター版が使用されます。

例えば、GetUserName API は次のようなプロトタイプになると考えればよいでしょう。 (実際の定義は WinBase.h にありますのでご覧ください)

BOOL GetUserNameA ( char* lpBuffer, DWORD* pcbBuffer );

BOOL GetUserNameW ( wchar_t* lpBuffer, DWORD* pcbBuffer);

つまり、/DUNICODE を指定することによって GetUserName はコンパイラによって GetUserNameW として解釈され、指定しなければ GetUserNameA として解釈されるということです。

デバッグ情報の生成

/Zi コンパイラオプション及び /DEBUG, /PDB, /MAP リンカオプションで、PDB (プログラム・データベース, シンボルファイルとも言います) 及び map ファイルを生成できます。

PDB ファイルはソースコードのシンボル情報 (変数名や関数名等) です。 map ファイルはテキスト形式のアドレスマップです。

PDB ファイルは本番の運用環境において、WinDbg や CDB などのデバッガを使ってデバッグするときに使用しますから、 ビルドを作ったら、EXE ファイルと共に PDB ファイルも保管するようにしてください。

ターゲット Windows バージョン指定

Windows API の中には Windows のバージョンによって使えるもの、使えないものがあります。 コンパイル時に _WIN32_WINNT でターゲットとなる Windows のバージョンを指定する必要があります。

> cl /c /D_WIN32_WINNT=0x0600 test.cpp

これはソース内で #define で定義するものと同様です。

尚、指定する値は以下の通りです。

Windows Server 2008 0x0600
Windows Vista 0x0600
Windows Server 2003 SP1, Windows XP SP2 0x0502
Windows Server 2003, Windows XP 0x0501
Windows 2000 0x0500

まとめ

おすすめのオプションとしては、次のようになります。

プログラムの開発中は以下のように、警告レベル 4, デバッグ情報有り、Unicode ビルドでコンパイルして、 PDB ファイル及び MAP ファイルの出力を指定して、リンクすると良いでしょう。

C:\Temp> cl /c /W4 /Zi /DUNICODE /D_UNICODE test.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

test.cpp
test.cpp(9) : warning C4100: 'argv' : unreferenced formal parameter
test.cpp(9) : warning C4100: 'argc' : unreferenced formal parameter

C:\Temp> link advapi32.lib /DEBUG /MAP:test.map /PDB:test.pdb test.obj
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

リリース時には最適化オプションも有効にして、以下のようにすると良いでしょう。

C:\Temp> cl /c /W4 /Zi /O1 /DUNICODE /D_UNICODE test.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

test.cpp
test.cpp(9) : warning C4100: 'argv' : unreferenced formal parameter
test.cpp(9) : warning C4100: 'argc' : unreferenced formal parameter

C:\Temp> link advapi32.lib /MAP:test.map /PDB:test.pdb test.obj
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

ちょっと駆け足ですが、この資料ではよく使うコンパイラオプションとリンカオプションを紹介しました。

« 前の記事 次の記事 »
複数ファイルのコンパイルとリンク方法 makefile の書き方

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説