自動リンク
#pragma comment (lib, "...") および #pragma link "..." は、両方とも自動リンクを有効にします。
これらは、何も指定されない場合に、デフォルトの拡張子が異なります。 このロジックは短い拡張子、つまり 3 文字以下の拡張子のみをサポートすることに注意してください。
拡張子が指定されない場合 #pragma link "..." はデフォルトで 、Win32 および Win64 でそれぞれ .obj と .o になります。#pragma comment(lib, "...") では、.lib が WIN32 および WIN64X (Modern) に場合に、.a が WIN64 の場合にデフォルトとなります。
次の表に示します。
| Pragma | ファイル自動リンクされた WIN32 | ファイル自動リンクされた WIN64 | WIN64X で自動リンクされるファイル | メモ |
|---|---|---|---|---|
| #pragma link "Network.util" | "Network.util.obj" | "Network.util.o" | "Network.util.o" | |
| #pragma link "Network.util.os" | "Network.util.os" | "Network.util.os" | "Network.util.os" | .os は拡張子として扱われます |
| #pragma comment (lib, "Network.util") | "Network.util.lib" | "Network.util.a" | WIN64X でのライブラリの自動リンクについては、以下のセクションを参照してください。 | |
| #pragma comment (lib, "Network.util.os") | "Network.util.os" | "Network.util.os" | WIN64X でのライブラリの自動リンクについては、以下のセクションを参照してください。 | .os は拡張子として扱われます |
WIN64X で自動リンクされるライブラリ
bcc64x.exe コンパイラと ld.lld.exe リンカによるライブラリの自動リンクでは、新しいツールチェーンにおける検索プロセスを伴います。 このプロセスでは、拡張子を含む複数の名前形式が検索され、見つからない場合にのみエラーが返されます。 一致する形式が見つかると、検索は停止します。 検索対象となるファイルは、デフォルトで静的と動的のどちらを使用するかによっても異なります。以下の表は、静的モードと動的モードで検索されるファイルを示しています。
| 静的 | 動的 |
|---|---|
<name> + ".lib"
|
<name> + ".bpi"
|
"lib" + <name> + ".dll.a"
|
"lib" + <name> + ".dll.a"
|
<name> + ".dll.a"
|
<name> + ".dll.a"
|
"lib" + <name> + ".a"
|
"lib" + <name> + ".a"
|
<name> + ".lib"
|
リンカは上記に示される検索を実行します。 したがって、コード #pragma comment(lib, <name>) 経由や、-lname でのコンパイラ経由、もしくは -lname でのリンカ経由での自動リンクには、いずれも同じ検索が適用されます。
また、#pragma comment(lib, "mydll") を使用することができ、インポート ライブラリの必要がありません。
詳細については、ドキュメント「DLL へのリンク」を参照してください。
デフォルトのライブラリとライブラリ リンクの検索
ライブラリ X を検索する場合、ツールチェーンは次の順番で検索します:
- libX.a
- X.lib
ライブラリは、静的ライブラリとパッケージ ライブラリの両方とも、拡張子として .lib を使用します。 しかしながら、多くのデフォルト Windows DLL のインポート ライブラリは、libX.a の慣例に従っており、kernel32.dll へのリンクに使用されるライブラリは libkernel32.a となります。
例えば、uxtheme へリンクする正しい方法は、次のとおりです:
#pragma comment(lib, "uxtheme")
これは libuxtheme.a にリンクしますが、ライブラリの自動検索により、リンクする対象の名前 (uxtheme) を指定するだけでよく、命名規則を気にする必要はありません。
静的 vs. 動的
静的がデフォルト設定です。 ただし、リンカ オプション -Bdynamic またはコンパイラ オプション -tR のその他 -txxx ターゲット オプションを指定することで、動的 に切り替えることもできます。