リンカ ツール エラー LNK1104
'filename' ファイルを開くことができません
このエラーは、リンカーがファイルを読み取るとき、または書き込むときに、そのファイルを開くことができなかった場合に報告されます。 この問題の一般的な原因としては、主に次の 2 つが挙げられます。
お使いのプログラムが既に実行されている。または、デバッガー内で読み込まれている。
ご自身のライブラリ パスが正しくない。または、二重引用符で囲まれていない。
他にもこのエラーには多くの原因が考えられます。 それを絞り込むには、まず filename ファイルの種類を確認します。 次に、次のセクションを使用して問題を特定し、修正します。
アプリまたはその .pdb ファイルを開くことができない
アプリが実行されているか、デバッガーに読み込まれている
filename がご自身の実行可能ファイルの名前、または関連付けられている .pdb ファイルである場合は、ご自身のアプリケーションが実行中かどうかを確認します。 次に、それがデバッガーに読み込まれているかどうかを確認します。 この問題を解決するには、プログラムを停止し、デバッガーからアンロードしてから、もう一度ビルドします。 アプリがリソース エディターなどの別のプログラムで開いている場合は、それを閉じます。 プログラムが応答しない場合は、タスク マネージャーを使用してプロセスを終了することが必要な場合があります。 また、Visual Studio を閉じて再起動しなければならない可能性もあります。
アプリがウイルス対策スキャンによってロックされている
ウイルス対策プログラムによって、新しく作成されたファイル、特に、.exe や .dll 実行可能ファイルへのアクセスが一時的にブロックされることはよくあります。 この問題を解決するには、ウイルス対策スキャナーから、ご自身のプロジェクト ビルド ディレクトリを除外してみます。
Microsoft ライブラリ ファイルを開くことができない
Windows ライブラリ (kernel32.lib など)
開くことができないファイルが、kernel32.lib など、Microsoft が提供する標準ライブラリ ファイルの 1 つである場合は、プロジェクト構成エラーまたはインストール エラーが発生する可能性があります。 Windows SDK がインストールされていることを確認します。 ご自身のプロジェクトに MFC などの他の Microsoft ライブラリが必要な場合は、MFC コンポーネントが Visual Studio インストーラーによってインストールされていることも確認してください。 インストーラーを再度実行すれば、オプションのコンポーネントはいつでも追加できます。 詳細については、Visual Studio の変更に関する記事を参照してください。 インストーラーの [個々のコンポーネント] タブを使用して、特定のライブラリと SDK を選択します。
バージョン管理された vcruntime ライブラリ
エラー メッセージに msvcr120.lib などのバージョン管理された Microsoft ライブラリがある場合、そのコンパイラ バージョンのプラットフォーム ツールセットがインストールされていない可能性があります。 この問題を解決するには、2 つのオプションがあります。つまり、プロジェクトをアップグレードして、現在のプラットフォーム ツールセットを使用するか、古いツールセットをインストールして、プロジェクトをそのままビルドします。 詳細については、以前のバージョンの Visual C++ からのプロジェクトのアップグレードに関するページと、「Visual Studio でネイティブ マルチターゲットを利用し、古いプロジェクトを作成する」を参照してください。
Retail、Debug、またはプラットフォーム固有のライブラリ
このエラーは、Retail や ARM64 などの新しいターゲット プラットフォームまたは構成用に最初にビルドするときに発生する可能性があります。 IDE で、[全般] プロパティ ページ内で指定されているプラットフォーム ツールセットと Windows SDK バージョンがインストールされていることを確認します。 また、[VC++ ディレクトリ] プロパティ ページで指定されているライブラリ ディレクトリ内で、必要なライブラリが使用できることを確認します。 Debug、Retail、x86、ARM64 など、各構成のプロパティを確認します。 機能するビルドと機能しないビルドがある場合は、両方の設定を比較してください。 必要なツールとライブラリのうち、不足しているものをインストールします。
vccorlib.lib ライブラリ
ユニバーサル Windows (UWP) アプリやコンポーネント用の Spectre 軽減ライブラリがありません。 エラー メッセージに vccorlib.lib が含まれている場合は、UWP プロジェクトで有効/Qspectre
になっている可能性があります。 この問題を解決するには、 /Qspectre
コンパイラ オプションを無効にします。 Visual Studio で、"Spectre 軽減" プロパティを変更してください。 プロジェクトの [プロパティ ページ] ダイアログの [C/C++>コード生成] ページにあります。
オンラインまたは他のソースのプロジェクトのライブラリ
別のコンピューターからコピーしたプロジェクトをビルドすると、ライブラリのインストール場所が異なる場合があります。 コマンド ライン ビルドの場合は、LIB 環境変数とライブラリ パスが、ビルドに対して正しく設定されていることを確認します。 Visual Studio では、プロジェクトの [プロパティ] ページで設定された現在のライブラリ パスを確認し、編集することができます。 [VC++ ディレクトリ] ページで、"ライブラリ ディレクトリ" プロパティのドロップダウン コントロールを選択し、[編集] を選択します。 [ライブラリ ディレクトリ] ダイアログの [Evaluated value]\(評価値\) セクションには、ライブラリ ファイルに対して検索された現在のパスが一覧表示されます。 ご自身のローカル ライブラリを指すように、これらのパスを更新してください。
更新された Windows SDK ライブラリ
このエラーは、Windows SDK への Visual Studio のパスが期限切れになっているときに発生することがあります。 これは、Visual Studio インストーラーとは別に新しい Windows SDK をインストールした場合に発生する可能性があります。 IDE 内でこれを修正するには、[VC++ ディレクトリ] プロパティ ページで指定されたパスを更新します。 パスに含まれるバージョンを、新しい SDK に合わせて設定します。 開発者コマンド プロンプトを使用する場合は、環境変数を初期化するバッチ ファイルを、新しい SDK のパスで更新してください。 この問題を回避するには、更新された SDK を、Visual Studio インストーラーを使用してインストールします。
サードパーティ製のライブラリ ファイルを開くことができない
この問題の原因はいくつか考えられます。
ライブラリ ファイルへのパスが正しくないか、二重引用符で囲まれていない可能性があります。 または、リンカーに指定していない可能性があります。
32 ビット バージョンのライブラリをインストールしたが、64 ビット用にビルドしている場合、またはその逆の方法を使用している可能性があります。
ライブラリは、インストールされていない他のライブラリに依存している可能性があります。
コマンド ライン ビルドのパスの問題を修正するには、LIB 環境変数が設定されていることを確認します。 使用するすべてのライブラリのパスと、ビルドするすべての構成のパスが含まれていることを確認してください。 IDE では、ライブラリのパスは、[VC++ ディレクトリ]>"ライブラリ ディレクトリ" プロパティで設定します。 ビルドするすべての構成について、必要なライブラリを含むすべてのディレクトリが、ここに示されていることを確認してください。
標準ライブラリ ディレクトリをオーバーライドするライブラリ ディレクトリの指定が必要になる可能性があります。 コマンド ラインで、このオプションを /LIBPATH
使用します。 IDE では、ご自身のプロジェクトの [構成プロパティ] > [リンカー] > [全般] プロパティ ページ内の "追加のライブラリ ディレクトリ" プロパティを使用します。
ビルドする構成に必要なすべてのバージョンのライブラリを必ずインストールします。 vcpkg パッケージ管理ユーティリティを使用して、多数存在する一般的なライブラリのインストールとセットアップを自動化することを検討してください。 可能な場合は、サードパーティ製ライブラリの独自のコピーを作成することをお勧めします。 これにより、ご自身のプロジェクトと同じ構成用にビルドされた、すべてのライブラリのローカル依存関係を確保することができます。
プロジェクトによってビルドされたファイルを開くことができない
リンカーがファイル名にアクセスしようとしたときにファイル名がまだ存在しない場合、このエラーが表示されることがあります。 これは、あるプロジェクトが他のソリューションのプロジェクトに依存しているとき、そのプロジェクトが間違った順序でビルドされている場合に、発生する可能性があります。 この問題を解決するには、そのファイルが使用されているプロジェクト内で、ご自身のプロジェクト参照を確実に設定します。 これにより、不足しているファイルは、必要になる前にビルドされます。 詳細については、Visual Studio C++ プロジェクト内の参照の追加に関するページとプロジェクト内の参照の管理に関するページをご覧ください。
'C:\Program.obj' ファイルを開くことができない
エラー メッセージにファイル名 C:\Program.obj が表示された場合は、ご自身のライブラリ パスを二重引用符で囲みます。 このエラーは、C:\Program Files で始まるパスが、二重引用符で囲まれずに、リンカーに渡された場合に発生します。 ラップされていないパスでも、同様のエラーが発生する可能性があります。 通常は、予期しない .obj ファイルが、ご自身のドライブのルート内に表示されます。
コマンド ライン ビルドでこの問題を解決するには、/LIBPATH オプション パラメーターを確認します。 また、LIB 環境変数内で指定されたパスと、コマンド ライン上で指定されたパスも確認します。 スペースを含め、すべてのパスを必ず二重引用符で囲んでください。
IDE 内でこの問題を解決するには、ご自身のプロジェクトに対する次のプロパティに、必要に応じて二重引用符を追加します。
[構成プロパティ] > [VC++ ディレクトリ] プロパティ ページ上の "ライブラリ ディレクトリ" プロパティ。
[構成プロパティ] > [リンカー]> [全般] プロパティ ページ内の "追加のライブラリ ディレクトリ" プロパティ。
[構成プロパティ] > [リンカー]> [入力] プロパティ ページ内の "追加の依存ファイル" プロパティ。
その他の一般的な問題
パスまたはファイル名の問題
このエラーは、リンカーに指定されたライブラリのファイル名またはパスが正しくないとき、 あるいは、パスに無効なドライブ仕様が含まれているときに発生することがあります。 コマンド ラインや任意の #pragma comment( lib, "library_name" ) ディレクティブで、問題がないかを確認してください。 スペルとファイル拡張子をチェックして、指定した場所にファイルが存在することを確かめます。
並列ビルドの同期
並列ビルド オプションを使用している場合、Visual Studio によって別のスレッドでファイルがロックされている可能性があります。 この問題を解決するには、同じコードオブジェクトまたはライブラリが、複数のプロジェクト内でビルドされていないことを確認します。 ビルド依存関係またはプロジェクト参照を使用して、ご自身のプロジェクト内のビルドされたバイナリを取得してください。
IDE 内で指定された追加の依存関係
"追加の依存ファイル" プロパティ内で個々のライブラリを直接指定するときは、スペースを使用してライブラリ名を区切ります。 コンマやセミコロンは使用しないでください。 [編集] メニュー項目を使用して [追加の依存ファイル] ダイアログ ボックスを開く場合は、コンマ、セミコロン、スペースではなく、改行を使用して名前を区切ります。 [ライブラリ ディレクトリ] ダイアログ ボックスと [追加のライブラリ ディレクトリ] ダイアログ ボックスでライブラリ パスを指定するときも、改行を使用します。
長すぎるパス
ファイル名のパスが 260 文字を超えると、このエラーが表示されることがあります。 必要に応じて、ディレクトリの構造を再配置するか、フォルダー名とファイル名を短くしてパスを短縮します。
大きすぎるファイル
このエラーは、ファイルが大きすぎる場合に発生することがあります。 1 ギガバイトを超えるサイズのライブラリまたはオブジェクト ファイルは、32 ビット リンカーの問題を引き起こす可能性があります。 この問題を修正するには、たとえば 64 ビット ツールセットを使用します。 コマンド ラインで 64 ビット ツールセットを使用する方法の詳細については、コマンド ラインで 64 ビット Visual C++ ツールセットを有効にする方法に関するページをご覧ください。 IDE で 64 ビット ツールセットを使用する方法については、64 ビット コンパイラとツールでの MSBuild の使用に関するページをご覧ください。 また、こちらの Stack Overflow の投稿「Visual Studio でネイティブの amd64 ツールチェーンを使用する方法」も参照してください。
不適切なファイル アクセス許可
これは、filename にアクセスするためのアクセス許可が不十分な場合に発生するエラーです。 これは、通常のユーザー アカウントを使用して、保護されたシステム ディレクトリ内のライブラリ ファイルにアクセスする場合に発生する可能性があります。 元のアクセス許可がまだ設定されている他のユーザーからコピーされたファイルを使用したりすると、発生する可能性があります。 この問題を解決するには、ファイルを、書き込み可能なプロジェクト ディレクトリに移動します。 移動されたファイルにアクセス不可のアクセス許可が設定されている場合は、管理者コマンド ウィンドウ内で takeown.exe コマンドを実行して、ファイルの所有権を取得します。
ディスク領域が不足しています
十分なディスク領域がないときに発生する可能性のあるエラーです。 リンカーが一時ファイルを使用するケースはいくつかあります。 十分なディスク領域がある場合でも、リンクが大きいと、使用可能なディスク領域が消費または断片化する可能性があります。 /OPT (最適化) オプションを使用することを検討してください。推移的な COMDAT 除去により、すべてのオブジェクト ファイルが複数回読み取られます。
TMP 環境変数の問題
filename に LNKnnn という名前が付いている場合、そのファイル名は、リンカーが一時ファイル用に生成したものです。 TMP 環境変数に指定されたディレクトリが存在しない可能性があります。 または、TMP 環境変数に複数のディレクトリを指定できます。 TMP 環境変数に指定できるディレクトリのパスは 1 つだけです。
上記以外の問題
ここに記載されている問題が当てはまらない場合は、Visual Studio 内のフィードバック ツールを使用すると便利です。 IDE で、メニュー バーに移動し、[ヘルプ] > [フィードバックの 送信] > [問題の報告] の順に選択します。 または、[ヘルプ] > [フィードバックの送信] > [提案の送信] を順に使用して、提案を送信します。 質問には Microsoft Learn Q&A サイトと Visual Studio C++ 開発者コミュニティ Web サイトを使用することもできます。 これらのサイトを使用して、質問に対する回答を検索したり、サポートを依頼したりしてください。 詳細については、Visual C++ ツールセットやドキュメントの問題を報告する方法に関するページをご覧ください。
この問題の修正方法として、この記事に追加すべき新しい方法が見つかった場合は、お知らせください。 このページの下のボタンを使用して、フィードバックをお送りください。 C++ ドキュメントの GitHub リポジトリ内で新しいイシューを作成してください。 よろしくお願いいたします。