VisualStudio2017で4kb intro作るときの準備方法。

1年くらい前の記事を拾ってきました。

TokyoDemoFest向けの実行ファイル作ってんだけど、ハマったマジで。

2018/9/24 VisualStudio2017Communityで設定を構築したので情報追記。
2018/11/2 64bit環境でコンパイルが失敗する挙動について追記。

  • VisualStudio上の設定は自動セーブされる。
    具体的には、自分の場合以下の項目でちょっと気をつけなきゃいけないぽい。
    オプションの設定でオブジェクトファイル作成後、リンク時に落っこちる
    調べてみたら、オプションでオブジェクトファイルに余計な記述加えることがあるらしく、それで落っこちる可能性がある、ということ。
    わけわからないエラーでビルドが失敗し続けてるなら一度プロジェクト作り直すのも手
  • ベース資料(これベースに作ってます。のたぐすさんとこ)
    http://wordpress.notargs.com/blog/blog/2015/02/28/%E3%83%A1%E3%82%AC%E3%83%87%E3%83%A2visualstudio2013%E3%81%A74kb%E3%81%AEexe%E3%82%92%E4%BD%9C%E3%82%8B/ちなみに追記で、$(SolutionDir)を指定する時に、「パスの一番先頭に持ってこないと最初にCrinklerが処理されない」らしいので注意。参考資料:
    http://nanka.hateblo.jp/entry/2018/07/01/034341
  • バッファセキュリティチェックについて
    「@__security_check_cookie@xが関数~で参照されました」というエラーが出ることがある。
    どうやらバッファオーバーランを検知するためのコードを埋め込むみたいで、不要なので削除する。
    普通のプログラムだったらあっても問題ないけど、サイズに著しく制限がかかる場合、入念なテストの上コードを抜くという選択肢を採用今回は、C/C++→コード生成→セキュリティチェック→セキュリティチェックを無効にしますを選択して対応(これ設定するとSDLより優先されるので、他でSDLチェックしていても大丈夫になる)参考資料:
    http://d.hatena.ne.jp/yellow_73/20070905

エラーの内容

image
  • アセンブラコードでFloat取り扱うときの注意点
    なんか一部命令がうまく認識しないみたい。
    よって、最初から最適化させて対応するのが早い。構成プロパティ→C/C++→最適化→最適化項目「無効」以外を選択する。

    これで認識するようになる。もしくは自分でfloat取扱用のアセンブラコード書くか。
  • パスに日本語を使わない方がいい
    海外ソフトにありがちなんだけど、
    Crinklerでリンク処理行うとき、ファイルの置き場所に日本語パスを指定してると文字が化けるので、正確なパスを参照できなくてエラーコード吐くという。日本語を含まないパスにファイルを置くことで解決するケースあり。
    どちらかというとアプリケーション側でマルチバイト対応していないがゆえに起こる問題。
    (ただ英語圏のソフトに対応を求めるのもおかしな話なので、個人で対応できたほうが早い)
  • サブシステムがクリアされてるケース
    新規にプロジェクト作成した場合、サブシステムが設定されてないのでエラー吐くことがある。リンカ→システム→サブシステム→SUBSYSTEM:Windowsを定義して対応。
  • Crinklerは最新のものを使おう
    何でかというと、元々結構過去のシステムへの対応してたみたいだけど、見たところWindowsSDKへの対応がかなり時間かかってたっぽい気が。具体的には、古いCrinklerを使うと謎のエラーでCrinklerが異常終了するので、それを回避する形になると時間がかかる。2018/9/24現在、同年更新されたファイルがあるので、それ使うとエラーが発生しなくなる。
  • glext.hからの呼び出しファイルが不足する
    自分の環境では、#include <KHR/khrplatform.h>

    って記述が正常に読み込まれなかったので改造して対応した。
    (ヘッダファイルとして読み込めればとりあえず問題はないので、VCのヘッダファイル集めてるフォルダに投げ込めば認識はしてくれる様子)ちなみに上記ソースは、各プラットフォーム特有の定義らしく、更新頻度は高いんじゃないかと思ってる。
  • 64bit環境でアセンブラは使いづらい
    https://www.officedaytime.com/tips/asm64/
    https://kagasu.hatenablog.com/entry/2018/01/03/20033764bit環境でインラインアセンブラの記述が使えないため、
    別途アセンブラ言語ファイルを記述、masmでアセンブルする必要あり。
    もしくはCompiler Intrinsicsの導入を検討。