Visual Studio 2015 で Direct3D11 Sample ビルド時の LNK2019

dxerr.lib(dxerrw.obj) : error LNK2019: unresolved external symbol _vsnwprintf referenced in function “long __cdecl StringVPrintfWorkerW(unsigned short *,unsigned __int64,unsigned __int64 *,unsigned short const *,char *)” (?StringVPrintfWorkerW@@YAJPEAG_KPEA_KPEBGPEAD@Z)

Visual Studio 2015 以降で、DirectX Sample ビルド時に上記の LNK2019 エラーが発生した場合は、プロジェクトのリンカーの設定に「legacy_stdio_definitions.lib」を追加する必要があります。

https://social.msdn.microsoft.com/Forums/en-US/5150eeec-4427-440f-ab19-aecb26113d31/updated-to-vs-2015-and-now-get-unresolved-external-errors?forum=vcgeneral

このリンクエラーは Visual Studio 2015 から printf 系の関数の実装が inline 展開されるようになったのが原因で発生しているみたいです。関数が inline 展開されるため、呼び出し側はコンパイル時に命令列に置き換わることになるので、関数の呼び出し先そのものが存在しなくなります。(今回であれば printf 関数のアドレスが無くなります)

プロジェクトのソースコードに書かれている printf は、コンパイル時に命令列に展開されるので問題は起こらないのですが、既にコンパイル済の (古いソースコードの) lib は printf の関数のアドレスが未だにどこかに定義されていると信じてリンク時に探しに行くのですが、該当の関数は inline 展開されているため見つけることができずにエラーになります。

legacy_stdio_definitions.lib をリンクすることで、この lib の中に古い (legacyな)  printf の実態を持つバイナリが含まれているため、これにリンクできるのでビルドが通るようになります。

もしリンクエラーを起こしている lib のソースコードが手元にある場合は、Visual Studio 2015 で一度 lib を作り直した方が良いのですが、無い場合は上記の legacy lib をリンクしてしまうのが一番早い解決のようです。

https://msdn.microsoft.com/en-us/library/bb531344.aspx

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください