『Game Engine Architecture』には次のように記述されています:
"Visual Studioは、エグゼキュータブルにリンクすべきライブラリを指定するために、様々な「魔法のような」手法を採用しています。例えば、ソースコード内に特殊な#pragma命令を記述することで、リンカーに対して特定のライブラリを自動的にリンクするよう指示できます。このため、「追加の依存ファイル」フィールドに実際にリンクしているライブラリがすべて表示されない場合があります。(実は、それゆえに「追加」の依存ファイルと呼ばれるのです。)例えば、DirectXアプリケーションでは、すべてのDirectXライブラリを手動で「追加の依存ファイル」フィールド списокしていないことに気づいたかもしれません。その理由が分かったはずです。"
解説
Visual Studio環境において、C++のソースコード内で以下の記述を行うことで、リンカーが特定の静的ライブラリ(.libファイル)を自動的にリンクします。
#pragma comment(lib, "ライブラリ名.lib")
この記述があれば、「プロジェクトプロパティ → リンカー → 入力 → 追加の依存ファイル」を手動で編集する必要がなくなります。
利点と特徴
| 従来の手法 | #pragma comment(lib)使用時 |
|---|---|
| プロジェクト設定で個別に追加 | ソースコード上に直接記述 |
| 設定漏れや入力ミスの可能性 | コードと一緒に管理でき視認性が高い |
| 依存関係とソースの分離 | 依存関係をソースコードと一体化 |
使用例
Direct3D 11を利用するシーンでは、以下のように記述します。
#pragma comment(lib, "d3d11.lib")
#include <d3d11.h>
// 以降のアプリケーションコード...
この場合、プロジェクトプロパティ内に依存関係を一切追加하지 않아しても、正しくコンパイル、リンク、および実行が可能です。これがこの手法の便利な点です。
Visual Studio標準の主要なライブラリ(自動リンク対象)
| ライブラリ | 用途 |
|---|---|
| user32.lib | ウィンドウ管理、メッセージループ処理 |
| gdi32.lib | GDIグラフィックスインターフェース |
| kernel32.lib | システムコール、スレッド管理 |
| d3d11.lib | Direct3D 11 |
| dsound.lib | DirectSoundオーディオ |
| ws2_32.lib | ネットワークソケット编程(Windows Sockets) |
多くのSDK(DirectX、FMOD、OpenALなど)では、ヘッダーファイル内に#pragma comment(lib, "xxx")を記述することを推奨しています。これにより、開発者は使用する際にライブラリ名を記憶しておく必要がなくなります。
注意点
| 項目 | 説明 |
|---|---|
| 静的ライブラリ(.lib)のみ対応 | 動的リンクライブラリ(.dll)自体には使用不可 |
| MSVCコンパイラ限定 | GCCやClangではこのpragma指示子は動作しない |
| ヘッダーに記述すると複数回含まれる可能性 | コンパイラが適切に処理するため競合の心配は少ない |
| 同じライブラリを複数のファイルで重複記述しても問題なし | リンカーが自動的に重複を排除 |
まとめ
#pragma comment(lib, "xxx.lib")は、ライブラリへの依存関係をソースコード内に直接記述し、コンパイルとリンクのプロセスを自動的に処理できる便利な手法です。Visual Studioを使用し、大規模なプロジェクトでモジュール化開発を行う場合に特に有効です。