C++ 【解説】LNK2001 外部シンボル sprintf は未解決です

Visual Studio 2010で作成したプロジェクトをVisual Studio 2015でビルドし直してみると

 

LNK2001 外部シンボル sprintf は未解決です。

 

というエラーが出る事があります。

このエラーの意味と対処方法について解説してみます。


なぜエラー LNK2001 が出るのか?

原因の詳細については以下のサイトで説明されています。 

Visual C++ 2015 での互換性に影響する変更点

 

この中の「現在、関数の printf ファミリと scanf ファミリは、インラインで定義されています。」という部分が問題の箇所になります。

 

利用しているライブラリ(Libファイル)がVisual Studio 2015以前でコンパイルされていて、そのライブラリが _sscanf や _sprintf などの関数を使用している場合、それらの関数は別のライブラリにあるはずと思って探します。しかし関数がインライン化された事で参照すべき実体が存在しなくなってしまった為に起こるエラーなのです。


対処方法

Microsoftはすべての静的ライブラリを再コンパイルすることを推奨しています。

 

そう言われても外部から提供されたライブラリなどを使っているとそれは簡単な事ではありません。

そこでlegacy_stdio_definitions.libをリンクするという方法でも対処する事が出来るようになっています。

 

  

メニューから[プロジェクト(P)]→[プロパティ(P)]を開き、左側のツリーからリンカ→入力を選びます。

追加の依存ファイルlegacy_stdio_definitions.libを追加します。

(既に他のファイルが指定されている場合は「;」で区切って追加します)