stMind

about Tech, Computer vision and Machine learning

LNK1104

DLLを作っていて、LKN1104に1時間ほどはまってしまいました。

LINK: fatal error LNK1104: ファイルhoge.libが開けません。

てな具合のよくみるエラーです。
ヘッダ内でエクスポートする関数の名前空間を指定しておきながら、cppファイル内では
名前空間を指定せずに関数定義を記述していたので、DLLのビルド時にlibが作成されてなくて、そりゃ当然
開けないよね、という結論でした。

MSDNのLNK1104を見ると

  • ディスク容量が足りません。
  • ファイルが存在していません。
  • プロジェクトのプロパティ ページ ダイアログ ボックスでライブラリを指定するときは、コンマではなく空白でライブラリ名を区切る必要があります。
  • ファイル名またはパスの指定に誤りがあります。
  • ドライブの指定が無効です。
  • ファイルに適切なアクセス権がありません。
  • 展開した filename のパス名が 260 文字を超えています。
  • 指定されたファイル名が LNKn の場合は、一時ファイル用にリンカが生成したファイル名です。このとき、環境変数 TMP で指定されたフォルダが存在しないか、または複数のフォルダが環境変数 TMP に指定されている可能性があります。環境変数 TMP に指定できるフォルダ パスは 1 つだけです。
  • このエラー メッセージがライブラリ名で発生していて、以前のバージョンの Microsoft Visual C++ 開発システムから .mak ファイルを移植している場合は、ライブラリは無効になっています。この環境でライブラリがまだ存在しているかどうかを確認します。
  • 別のプログラムでファイルが開かれている可能性があり、リンカがファイルに書き込むことができません。
  • LIB 環境変数が間違っています。LIB 環境変数を更新する方法については、「[VC++ ディレクトリ] ([オプション] ダイアログ ボックス - [プロジェクトおよびソリューション])」を参照してください。必要なライブラリを格納したディレクトリがここに列挙されていることを確認してください。

とたくさんの理由がありますが、経験上、ファイルが本当にないか、もしくはファイル名とかパスの指定が間違っているかの
どちらかであることが多いと思います。
なので、LNK1104を見たら、

  • ファイルは存在しているか?
  • 存在しているならばファイル名は正しいか?パス名は正しいか?
  • 存在していないならばエクスポートの指定は正しいか?

といった点をチェックすれば、原因の特定は比較的早くできるのではないかと思います。