VisualStudio 2013→2017のバージョンアップに伴う問題の対応
かなり間が空いてしまったが、
「Visual Studio 2017のインストール」をしたので
初音ミク冒険記のソースを
VisualStudio 2013→2017とバージョンアップする際に出た問題の
対応について書こうと思う。
■まずは、ソリューションファイルとプロジェクトファイルのバージョンアップ
VisualStudio 2017をインストールしたからと言って
既存のソリューションファイル.slnをダブルクリックしても
VisualStudio 2017は起動しない。
このことは、前に書いた記事
「Visual Studio Version Selectorの話」の通り。
このため、VisualStudio 2017を起動してから
ソリューションファイルを開くことにする。
ここでバージョンアップに伴うコンバートが行われるんだけど
どうやら、ソリューションファイルに含まれるプロジェクトファイルは
コンバートされないようだ。
その証拠として、プロジェクトファイルを更新して閉じるても
既存のソリューションファイル.slnをダブルクリックして
起動するのは、VisualStudio 2013だった。
どうしたらソリューションファイルがコンバートされるのか?
ソリューションエクスプローラのツリーで
1番上にあるソリューションファイルを選択して
メニュー「ファイル」-「~.slnを保存」をし
ソリューションファイルを上書きすることでコンバートされる。
コンバートと言っても、差分比較をしたところ
ソリューションファイルのフォーマット自体は変わっていないようだ。
VisualStudio Version Selectorが行う
バージョンチェック用の情報が書き換わっていて
ソリューションのGUIDが設定されただけみたい。
こちらも主な変更はバージョン番号関連だ。
WindowsTargetPlatformVersionというのが増えていて
どうやらこれは、プロジェクトのプロパティページを開いて確認したところ
「全般」にある「Windows SDK バージョン」に対応しているようだ。
選択肢としては、他に8.1があったので
Windows 8.1と10にしか対応してないんだろう。
■ビルドで __iob_func リンクエラー
Error LNK2019: unresolved external symbol ___iob_func referenced in function
見たことのないビルドエラーだったので調べてみたところ
「___iob_func リンクエラー」という記事を見つけた。
どうやら、VisualStudio 2013以前と2015以降では
異なる定義となっていることが問題らしい。
VS2015より前のバージョンでは#define stdin (&__iob_func()[0])
#define stdout (&__iob_func()[1])
#define stderr (&__iob_func()[2])が定義されていて
VS2015では
#define stdin (__acrt_iob_func(0))
#define stdout (__acrt_iob_func(1))
#define stderr (__acrt_iob_func(2))と定義が異なっているためのエラーのようです。
初音ミク冒険記では、DXライブラリを始め
Lua、EffekseerForDXLib、ssbplib、ADX2LEといったライブラリを使っている。
さすがに、
すべてのライブラリを VS2015以降 でリビルドというのは、面倒くさいし、
ADX2LEはDLLで提供されているから、そもそもリビルドできない。
このため、定義がないなら定義してしまえということで
下記の定義を行った。
// Visual Studio 2015以降のリンクエラー対策用コード
FILE _iob[] = { *stdin, *stdout, *stderr };extern "C" FILE * __cdecl __iob_func(void)
{
return _iob;
}
■LNK2019 未解決の外部シンボル printfやscanf系
「C++ 【解説】LNK2019 未解決の外部シンボル _sscanf が関数 xxx で参照されました」
という記事を見ると
VisualStudio 2015から
関数の printf ファミリと scanf ファミリは、インラインで定義されているらしい。
このため、利用しているライブラリが2013以前でビルドされていると
これまで参照できていた関数がインライン化された事で
実体がなくなってしまったので発生するエラーのようだ。
追加の依存ファイルに「legacy_stdio_definitions.lib」を
追加することで対応した。
以上の対応を行うことで
初音ミク冒険記のVisualStudio 2017対応のビルドはできた。
ビルド後に出てきた問題対応は、また別の記事で。
| 【固定リンク】 | 【コメント (2)】 | 【トラックバック (0)】
このエントリーへのリンク
トラックバック
この記事へのトラックバックの一覧です: VisualStudio 2013→2017のバージョンアップに伴う問題の対応:
コメント
このブログの新着コメントをRSSリーダに登録する為のxml今年は2019年なのに
LNK2019が話題になりませんね。
投稿者: (2019/02/24 11:23:37)
2019年だからLNK2019、その発想はなかった[→◇←]
投稿者: かげさん (2019/02/24 15:41:05)