最新のVS2019ではないのが悲しいですが…。MovieLayerPlayerやらWindowModePatchを再度構築できる環境を整えるためにVisualStudio2017でビルドができるようにいろいろと設定やらファイルの文字コードやらを変更していってみるといろいろと大変なことがわかってしまって「ぎゃ~~~」と言いながら作業していました…。
(VS2010から見たら)だいぶ変わってしまったVS2017でした
結局ビルド環境を整えなおすのに丸2日かかってしまいました。しかもとりあえずビルドに成功したのはMovieLayerPlayerの方でWindowModePatchはまだテストしていない状態です。まあ、こちらを先にやったのはほかのライブラリのビルドなどを考えた結果なのですが…。
ディレクトリの設定はVS2010と変わらず
この辺はこちらの記事を参考にできます。自分で書いて自分で忘れているのが悲しいですね…。特にDirectXや自分で作ったライブラリ・インクルードファイルを参照する場合はこの設定がないとちょっと厳しいので気を付けましょう。DirectXのSDKはDirectX9系だと良くてもJune2010なのでインストールしたくないため仮想マシンで一度展開して必要なものだけコピーしていますので、そのためにもディレクトリの設定は設定ファイルからやらないとまずい、ということもあったりします。
ソースコードの文字コード設定には気を付けて
今回文字コードをShiftJIS(CodePage932)からUNICODE系へと変更しています。面倒なのが、
- ソースコード(cpp,hなど)はBOM付きUTF-8へ
- リソースファイル(rc)はUTF-16へ
にしないとまずいということ。ソースコードにBOMを付け忘れると勝手にShiftJISと認識されて大量のエラーが出てきますので気を付けて。
またリソースファイル(rc)はVS2017の移行+文字コード変更いろいろな変更があり特に、
- インクルードしているヘッダをafxres.hからwinres.hに変更すること
- 文字コード設定(#pragma codepage)を削除して文字コードをUTF-16と認識させる
という作業が必要になります。なぜかrcファイルではBOM付きUTF-8は認められない様子なので気を付けてください。
ライブラリを構築するときの依存性設定がさらに厄介に
VS2010では依存性を持たせるだけでは自動的にリンクがされず、[共通プロパティ]=>[Frameworkと参照]で依存するプロジェクトを参照として追加する必要がある、とは書いたのですが、これがVS2017になると、ソリューションエクスプローラから対象のプロジェクトを開くとソースファイルやヘッダファイルがあるところに「参照」となぜかこちらに参照設定が来ていますのでこれで設定しましょう。こちらに参照設定をすることでライブラリがリンクされるようになります。
そしてどうも設定ミスなのかバグなのかわからない現象にはまってしまったのが、「依存しているライブラリをリンクしてくっつける場合、依存先(つまり子)のライブラリの構築時にプリコンパイル済みヘッダが設定されているとそのライブラリを使うプログラムを構築するときにLNK2019エラーが発生してリンクに失敗する」という現象でした。つまい、複数のライブラリをまとめて一つのライブラリとして扱う場合、親以外のライブラリにプリコンパイル済みヘッダを設定しているとプログラムを作るときに失敗する、という現象になります。何か設定で回避できるのかどうかよくわかりませんが、今のところ単純な回避策は「プリコンパイルを使用しないように設定してビルドする」以外思いつかないのが現状だったり。解決法を知っている人は教えてください…。
bind2ndやらmem_funやらが非推奨に
なっています。正しく言うならbind2ndやmem_funがfunctionalに移ったため、そちらをインクルードしないとコンパイルに失敗する、というものですが、どうせこの機会なのでbind2ndはbindとplaceholdersの組み合わせに、mem_funはmem_fnを使ったパターンに切り替えてしまいました。bind1stやbind2ndとかの限定版よりbindの方が使いやすいのでそちらに切り替えてしまいましょう。
WindowsXP以前に必要としていたルーチンはもう必要ないよね…?
ということで、いくつか片づけました。特にGetVersionExを使っていた部分はDeprecatedとなっていますのでVersionHelperのIsWindows系関数でバージョンを判定するように変更するとか、cpuidに関するルーチンを再構築したりとか、x86系のコンパイルでSSE2はもう当たり前だと思うので一部のプロジェクトで設定するとかしています。これで早くなるかどうかはよくわかりませんが…。
いくつか最新機能も取り入れてみた
私の場合はWindowModePatchなどの関係もあり、解像度の設定で解像度を文字列で表す、というのをやっているので4Kが3840×2160になる、とかWindows10に関するバージョン検知なども少し書き直しています。次回のWindowModePatchのアップデートはまずはVisualStudio2017でのコンパイル版にすることと、解像度を増やすことと、あとはスケーリング処理に関する部分を入れてみることでしょうか。といってもどれだけ時間が取れるのかは未定ですが。