🐏

「LNK2001: 外部シンボル __iob は未解決です」 Windows/VSアップデート後のビルドエラー対処

に公開

はじめに

Windows OS や Visual Studio のアップデート後、以前はビルドできていたプロジェクトで「LNK2001: 外部シンボル __iob は未解決です」エラーが発生した際の備忘録です。
私自身、Windows Update後にVisual Studioの対応バージョンが変わり、VSのアップデートをしたら古いライブラリでこのビルドエラーが発生し、対応に苦慮しました。
同じ問題で困っている開発者の方の助けになれば幸いです!

エラーの概要

Windows OS や Visual Studio のアップデート後、sprintfsscanf_vsnprintf などの標準 C ライブラリ関数を使用しているプロジェクトで、以下のようなリンカーエラーが発生することがあります。

LNK2001: 外部シンボル __iob は未解決です
LNK1120: 1 件の未解決の外部参照

この LNK2001 エラーは、リンカが __iob、_iob、__p__iob などの標準入出力ライブラリに関連するシンボルを見つけられないことを意味しています。つまり、プログラムに必要な部品がどこにあるか分からなくなってしまった状態です。

なぜこのエラーが発生するのか?

アップデートによって Visual Studio のランタイムライブラリのバージョンや設定が変更されることがあり、これが原因で以前ビルドできていたプロジェクトでエラーが発生する可能性があります。特に、ソースコードの入手やリビルドが不可能な、サポート終了した古いライブラリを使用している場合、このエラーは発生しやすくなります。

Visual Studio のバージョン間にはバイナリ互換性がない場合があり、異なるバージョンでビルドされたライブラリとプロジェクトをリンクしようとすると、LNK2001 エラーが発生する可能性があります。

試行錯誤と解決策

私もこのエラーに遭遇し、様々な解決策を試しました。

  • ランタイムライブラリの変更 (/MT, /MD など): 別の関連エラー解決に繋がることもあるらしいのですが、今回は有効ではありませんでした。
  • legacy_stdio_definitions.lib のリンク: 上記と同じく。
  • 別ライブラリの検討: OSSには候補がなく、自作するには規模が大きかったため断念。
  • Visual Studio のバージョンを下げる: これが最終的な解決策となりました。しかし、古い Visual Studio の環境構築は手間がかかります。。

最終的には、ライブラリをビルドしたバージョンの Visual Studio に対応したを仮想環境を構築することで、この問題を解決しました。

仮想環境の構築

  1. Visual Studio と Windows のバージョンを確認: 問題が発生したプロジェクトで使用していた Visual Studio と Windows のバージョンを正確に把握します。
  2. 仮想マシンに旧バージョンの WindowsOS をインストール: Visual Studio に対応する Windows OS を仮想マシンにインストールします。
  3. 仮想マシンに Visual Studio をインストール: 必要なコンポーネントやライブラリを含めてインストールします。

仮想環境の種類

仮想環境には、VMware、Hyper-V、VirtualBox などがありますが、 VMware を採用しました。

  • Hyper-V: Windows Update の影響で使用できなくなるリスクがあります。
  • VirtualBox: 基本設定では動作が遅く、設定調整の技術が必要です。
  • VMware: 2024年から無償化もされており、基本設定のみで VirtualBox よりも高速に動作するため、こちらを採用しました。

今後の予防策

  • 理想的には、ビルドの必要がなくなるようなアプリ体系に移行することが望ましいですね。
  • どうしても古いライブラリを使い続けなければならない場合は、仮想環境の利用を検討しましょう。

まとめ

Windows や Visual Studio のアップデート後に発生した「LNK2001: 外部シンボル __iob は未解決です」エラーの解決策として、ライブラリをビルドしたバージョンの Visual Studio を仮想環境にインストールする方法を紹介しました。
この記事が、同じ問題で悩んでいる開発者の方々にとって少しでもお役に立てれば幸いです!

参考文献

Discussion