【MFC】LNK1104: mfc120.lib / mfc140.lib が見つからない時の連鎖依存特定法

LNK1104: mfc120.lib / mfc140.lib が見つからない時の連鎖依存特定法

mfc120.lib (mfcXXX.lib) が開けません」と言われた時、「そんな古いライブラリ、設定のどこにも書いてないのに!」と頭を抱えたことはありませんか? コードにもプロジェクト設定にも記述がないのに、ビルドが通らない。これは、私たちが「ワナ」によくハマる典型的なパターンです。

この記事では、そんな「見えないライブラリ指定」の犯人を特定し、解決するための手順をまとめました。まずはじめに、この手順で切り分けてみてください。

エラーの原因切り分け:なぜ「書いていない」ファイルが要求される?

まずは、エラー番号と状況から原因を整理しましょう。

エラー症状原因の可能性
LNK1104ファイル自体がない / 開けない連鎖依存 (Implicit Linking)
LNK2019シンボル (関数/変数) が合わない設定の不一致 (x64/x86) 等

今回のケースは LNK1104 です。しかし、単なるパス設定ミスではなく、外部ライブラリの中に埋め込まれた「古い記憶(リンク指示)」が原因であるケースがほとんどです。


検証環境:
  Visual Studio 2026
  Visual Studio 2008:今回は2008で作成したOldLib.libというライブラリを使用しました。

手順1: 「見えない鎖」の正体を知る (所要時間:2分)

なぜ VS2026 でビルドしているのに、VS2008 (mfc90u.lib) が要求されるのでしょうか。

原因は、リンクしている「自社製ライブラリ」や「サードパーティ製ライブラリ(.lib)」の中にあります。

C++には #pragma comment(lib, "...") という機能があり、ライブラリを作成した時点の環境情報(「俺は mfc90u.lib を使うぞ」という記録)が .lib ファイル内に埋め込まれます。これを Default Library Search Record と呼びます。

VS2026 のリンカーは親切にもこの記録を読み取り、指示通りに mfc90u.lib を探そうとします。しかし、今の PC にそんな古いファイルはありません。これが「コードに書いていないのにエラーが出る」カラクリです。

手順2: 犯人のライブラリを「自白」させる (所要時間:5分)

「どの .lib が古い MFC を呼んでいるのか?」さえ分かれば解決できます。リンカーの診断機能を使って、隠れた依存関係を暴きましょう。

  1. プロジェクトのプロパティ を開きます(ソリューションエクスプローラーで右クリック)。
  2. [リンカー] > [全般] を選択します。
  3. [詳細なリンカー出力の表示] (Show Progress) を 「ライブラリの検索を表示 (/VERBOSE:LIB)」 に変更します。
VS2026 リンカー 進捗状況 設定
  1. [OK] を押し、リビルドを実行します。

手順3: ログから「検索」と「要求」の連鎖を見つける (所要時間:5分)

ビルドが失敗したら、出力ウィンドウ(エラー一覧ではありません)を確認してください。大量のログが出ていますが、焦る必要はありません。

  1. Ctrl + F で、エラーになっているファイル名(例:mfc90u.lib)を検索します。
  2. 以下のようなログの並びを探してください。
1>      OldLib.lib を検索中:                   <-- ① ここが犯人!
1>        "void __cdecl OldFunction(void)" ...
1>          VS2026SampleDlg.obj で参照されています。
1>          OldLib.lib(stdafx.obj) を読み込みました。
1>  /DEFAULTLIB:mfc90u.lib オプションで処理を行いました。   <-- ② ここで要求している

このログは、「OldLib.lib を読み込んだら、その中に mfc90u.lib を使えという指示があったので、探したが見つからなかった」ことを意味しています。これで犯人が OldLib.lib だと特定できました。

注意: 調査が終わったら、ビルド速度が遅くなるため /VERBOSE 設定は必ず元に戻してください。

手順4: 修正フロー (所要時間:10〜30分)

犯人が分かったら、以下のいずれかで対処します。

  • 対策A:ライブラリをリビルドする(推奨)
    • そのライブラリ(例:OldLib.lib)のソースコードがあるなら、VS2026 (v145) でビルドし直してください。依存関係が mfc145.lib に更新され、最もきれいに解決します。
  • 対策B:特定のライブラリを無視する(ソースがない場合)
    • [リンカー] > [入力] > [特定の既定のライブラリの無視] に、エラーが出ている mfc90u.lib などを入力します。
    • ※ただし、ライブラリ内部で MFC の構造体に依存している場合、実行時にクラッシュするリスクがあります。
  • 対策C:互換MFCラッパーを入れる
    • mfc90u.lib (VS2008) の場合は、サポートが終了しているため、原則として 対策A(リビルド) が必要です。

最終手段:どうしても解決しない場合

上記を試しても解決しない、あるいは「ファイルはあるはずなのに開けない」場合は、基本に立ち返ってください。

  • MFCのインストール忘れ: 新しいPC環境では、デフォルトでMFCが入っていないことが多々あります。VS Installerで「MFC」と検索し、チェックが入っているか確認してください。
  • パスの指定ミス: 謎のパスエラーが出たら、相対パスではなく絶対パスで指定してみるのも手です。

まとめ:再発防止チェックリスト

最後に、次回の自分のためにこれだけは確認しておきましょう。

  • [ ] ビルドエラーが出たら、まず /VERBOSE:LIB でログを吐かせる
  • [ ] 「コードに書いてない」エラーは、リンクしている .lib の中身を疑う
  • [ ] 古いプロジェクトの移行時は、全ライブラリのリビルドを検討する
  • [ ] 新しいPCにはまず VS InstallerでMFCを入れる

MFCのビルドエラーは、原因さえ分かれば5分で直せます。「見えない鎖」に時間を奪われないよう、まずはリンカーに自白させることから始めましょう。