« 2018年12月 | トップページ | 2019年2月 »

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)

2019.01.11

今更だけど「あけおめ、ことよろ2019」、そして★祝!ブログ開設14周年!★

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

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

あけましておめでとうございます

「あけおめ、ことよろ」のブログ記事を書き忘れた、かげさんです。

元旦恒例の初詣でのおみくじは大吉でした。

病気は「なおる 信心が第一」ということで
今年こそ元気になるのです!

正月は、親が初売りで買ってきたドローンで遊びました。

さて、今年も1月11日がやってまいりました!

111ということで、このブログは本日で14周年です

去年もそうでしたが
更新頻度が落ちているのは、大抵、
・体調が悪い
・やる気がガタ落ち
・記事を書くネタがない
って感じなので、ちょくちょく記事を投稿している時は
体調が良かったり、やる気がある方なわけでして
ある意味、ブログ記事の量が健康のバロメータみたいな感じになってます。

話が変わって、初音ミク冒険記の開発については
去年の1月11日と今日時点での、
Tracで管理しているチケット数は以下の通り。
 チケット総数 :532→537
 消化チケット数:370→372
 残チケット数 :162→165

全然開発してないから、大して変わりがないな・・・

今は、開発環境をVisual Studio 2013→2017にしてビルドし直したりしてます。

Effekseerのエフェクトの再生の動きが
ちょっと変わってしまい、その調査をしてるとこです。

ヒールとエアリアルステップの動きがなんかおかしい・・・

動画を再生するには、videoタグをサポートしたブラウザが必要です。

PS
かげさんと同じ1月11日にからブログを始めた
のっちさんの「西訪旅游 ~タイ ピピ島・クラビ・プーケット 諸々アジア旅のブログ~」も14周年です!

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

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

« 2018年12月 | トップページ | 2019年2月 »