« 今更だけど「あけおめ、ことよろ2019」、そして★祝!ブログ開設14周年!★ | トップページ | _MSC_VERの話(2019年01月末時点) »

2019.01.25

VisualStudio 2013→2017のバージョンアップに伴う問題の対応

| |コメント (2)|トラックバック (0)

 このエントリーをはてなブックマークに追加

かなり間が空いてしまったが、
Visual Studio 2017のインストール」をしたので
初音ミク冒険記のソースを
VisualStudio 2013→2017とバージョンアップする際に出た問題の
対応について書こうと思う。


■まずは、ソリューションファイルとプロジェクトファイルのバージョンアップ
VisualStudio 2017をインストールしたからと言って
既存のソリューションファイル.slnをダブルクリックしても
VisualStudio 2017は起動しない。

このことは、前に書いた記事
Visual Studio Version Selectorの話」の通り。

このため、VisualStudio 2017を起動してから
ソリューションファイルを開くことにする。

ここでバージョンアップに伴うコンバートが行われるんだけど
どうやら、ソリューションファイルに含まれるプロジェクトファイルは
コンバートされないようだ。

その証拠として、プロジェクトファイルを更新して閉じるても
既存のソリューションファイル.slnをダブルクリックして
起動するのは、VisualStudio 2013だった。

どうしたらソリューションファイルがコンバートされるのか?

ソリューションエクスプローラのツリーで
1番上にあるソリューションファイルを選択して
メニュー「ファイル」-「~.slnを保存」をし
ソリューションファイルを上書きすることでコンバートされる。

コンバートと言っても、差分比較をしたところ
ソリューションファイルのフォーマット自体は変わっていないようだ。
Visualstudio2017sln

VisualStudio Version Selectorが行う
バージョンチェック用の情報が書き換わっていて
ソリューションのGUIDが設定されただけみたい。

せっかくなのでプロジェクトファイルの差分も見てみる。
Visualstudio2017vcxproj

こちらも主な変更はバージョン番号関連だ。
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)

このエントリーへのリンク

このエントリーのリンクを入れるHTML:

トラックバック

この記事へのトラックバックの一覧です: VisualStudio 2013→2017のバージョンアップに伴う問題の対応:

コメント

このブログの新着コメントをRSSリーダに登録する為のxml

今年は2019年なのに
LNK2019が話題になりませんね。

投稿者: (2019/02/24 11:23:37)

2019年だからLNK2019、その発想はなかった[→◇←]

投稿者: かげさん (2019/02/24 15:41:05)




←名前とメールアドレスは必須です。
URLも記入すれば、URLのみが公開されます。
メールアドレスのみですと、メールアドレスが公開されてしまいますので、御注意ください。

↓コメント本文では、「a href」「b」「i」「br/」「p」「strong」「em」「ul」「ol」「li」「blockquote」「pre」のタグが使えます。絵文字をクリックすると、本文にタグを挿入できます。