リンク
C++ プロジェクトでは、コンパイラがソース コードをオブジェクト ファイル (*.obj) にコンパイルした後、 リンク ステップが実行されます。 リンカー (link.exe
) は、オブジェクト ファイルを 1 つの実行可能ファイルに結合します。
リンカーのオプションは、Visual Studio の内部または外部で設定できます。 Visual Studio 内でリンカーのオプションにアクセスするには、[ソリューション エクスプローラー] でプロジェクト ノードを右クリックし、[プロパティ] を選んでプロパティ ページを表示します。 左側のペインで [リンカー] を選んでノードを展開すると、すべてのオプションが表示されます。
リンカーのコマンド ライン構文
Visual Studio の外部でリンカーを実行する場合は、次の 1 つ以上の方法で入力を指定できます。
- コマンド ライン
- コマンド ファイルの使用
- 環境変数で
リンカーは最初に、 LINK
環境変数で指定されたオプションを処理し、その後にコマンド ラインとコマンド ファイルで指定された順序でオプションを処理します。 オプションが異なる引数で繰り返されている場合は、最後に処理されたものが優先されます。
オプションは、ビルド全体に適用されます。特定の入力ファイルにオプションを適用することはできません。
link.exe
を実行するには、次のコマンド構文を使用します。
link arguments
arguments
はオプションとファイル名を含み、任意の順序で指定できます。 最初にオプションが処理され、次にファイルが処理されます。 引数を区切るには、1 つ以上のスペースまたはタブを使用します。
Note
このツールは Visual Studio のコマンド プロンプトからのみ起動できます。 システム コマンド プロンプトやエクスプローラーからは開始できません。
コマンド ライン
コマンド ラインでは、オプション指定子 (ダッシュ (-
) またはスラッシュ (/
) で構成され、その後にオプションの名前が続きます。 オプション名の省略形は使用できません。 一部のオプションは、コロン (:
) の後に指定された引数を受け取ります。 /COMMENT
オプションの引用符で囲まれた文字列内を除き、オプション指定内ではスペースまたはタブは使用できません。 数値引数は、10 進または C 言語の表記で指定します。 オプション名とそのキーワードまたはファイル名の引数では大文字と小文字は区別されませんが、引数としての識別子では大文字と小文字が区別されます。
リンカーにファイルを渡すには、 link.exe
コマンドの後のコマンド ラインでファイル名を指定します。 ファイル名では、絶対パスまたは相対パスを指定できます。また、ファイル名ではワイルドカードを使用できます。 ドット (.
) とファイル名拡張子を省略すると、リンカーはファイルを検索する .obj
の拡張子を想定します。 リンカーは、ファイル名拡張子を使用しないか、ファイルの内容に関する想定を行うためにそれらの欠如を使用しません。 ファイルの種類を調べて判断し、それに応じて処理します。
成功した場合、リンカーは 0 を返します (エラーなし)。 それ以外の場合は、リンクを停止したエラー番号を返します。 たとえば、リンカーが LNK1104
を生成した場合、リンカーは 1104 を返します。 これにより、リンカーによってエラーで返されるエラー番号の最小値は 1000 です。 戻り値 128 は、オペレーティング システムまたは .config ファイルの構成の問題を表します。ローダーが link.exe
または c2.dll
を読み込んでいません。
リンカー コマンド ファイル
コマンド ライン引数をコマンド ファイルの形式で link.exe
に渡すことができます。 コマンド ファイルをリンカーに指定するには、次の構文を使います。
link @commandfile
commandfile
はテキスト ファイルの名前です。 アットマーク (@) とファイル名の間にスペースやタブを使用することはできません。 既定の拡張機能はありません。拡張子を含め、完全なファイル名を指定する必要があります。 ワイルドカードは使用できません。 ファイル名では、絶対パスまたは相対パスを指定できます。 リンカーは環境変数を使用してファイルを検索しません。
コマンド ファイルでは、引数はスペースまたはタブ (コマンド ラインと同様) と改行文字で区切られます。
コマンド ラインの全部または一部を、コマンド ファイルで指定できます。 link.exe
コマンドでは、複数のコマンド ファイルを使用できます。 リンカーは、コマンド ライン上のその場所で指定された場合と同様に、コマンド ファイル入力を受け入れます。 コマンド ファイルを入れ子にすることはできません。 リンカーは、 /NOLOGO
が指定されていない限り、コマンド ファイルの内容をエコーします。
例
次のコマンドは DLL をビルドします。 オブジェクト ファイルとライブラリの名前を個別のコマンド ファイルに渡し、 /EXPORTS
オプションの指定に 3 番目のコマンド ファイルを使用します。
link /dll @objlist.txt @liblist.txt @exports.txt
LINK 環境変数
リンカーは、次の環境変数を認識します。
LINK
と_LINK_
(定義されている場合)。 リンカーは、LINK
環境変数で定義されているオプションと引数の先頭に追加し、_LINK_
環境変数で定義されているオプションと引数を、処理する前にコマンド ライン引数に追加します。LIB
(定義されている場合)。 リンカーは、コマンド ラインまたは/BASE
オプションで指定されたオブジェクト、ライブラリ、またはその他のファイルを検索するときに、LIB
パスを使用します。 また、LIB
パスを使用して、オブジェクトで名前が付けられた.pdb
ファイルを検索します。LIB
変数には、セミコロンで区切られた 1 つ以上のパス指定を含めることができます。 1 つのパスは、Visual C++ インストールの\lib
サブディレクトリを指している必要があります。PATH
ツールがCVTRES
実行する必要があり、link.exe
自体と同じディレクトリにファイルが見つからない場合。 (link.exe
.res
ファイルをリンクするにはCVTRES
が必要です)。PATH
は、Visual C++ インストールの\bin
サブディレクトリを指す必要があります。TMP
OMF または.res
ファイルをリンクするときにディレクトリを指定する場合は a0/&。
関連項目
C/C++ ビルドのリファレンス
MSVC リンカー オプション
モジュール定義 (.def) ファイル
リンカーによる DLL の遅延読み込み