Visual C ++ 2015とOpenGLでいくつかのゲームを作成しました。自分のマシンで実行しても問題はありませんでしたが、他のマシンで実行すると、いくつかのDLLが欠落していることがわかります。ファイルが見つからないという問題を回避できるように、次回はそれが発生しないことを確認する方法と、どのようなことを考慮する必要があるのかを知りたいですか?
Visual C ++ 2015とOpenGLでいくつかのゲームを作成しました。自分のマシンで実行しても問題はありませんでしたが、他のマシンで実行すると、いくつかのDLLが欠落していることがわかります。ファイルが見つからないという問題を回避できるように、次回はそれが発生しないことを確認する方法と、どのようなことを考慮する必要があるのかを知りたいですか?
回答:
https://www.microsoft.com/en-us/download/details.aspx?id=48145など、実行可能ファイルを実行するマシンで使用したVisual Studioのバージョンの再配布可能ファイルをインストールする必要があります。VS2015の //www.microsoft.com/en-us/download/details.aspx?id = 48145など。また、DirectXまたは他のコンポーネントの再配布が必要になる場合があります。
通常、アプリケーションのインストーラーは、依存関係のすべての再配布可能ファイルをインストールします。InnoSetup、NSIS、WIX、またはその他のさまざまなツールを使用して、このようなインストーラーを作成できます。
再配布可能ファイルを必要としない実行可能ファイルを作成することは可能ですが、その場合、コアのWindows機能のサブセットに制限されます。これは一般に、あらゆる種類の意味のあるゲームや大規模なアプリケーションを作成するには不十分です。インストーラー自体は、実行するために依存関係を必要としないアプリケーションの例です。
MSVCRT.DLL
(MSVCPxxx.DLL
Visual Studioリリースに含まれているバージョン固有のバージョン)ではなく(Windows自体に含まれている)に対してリンクするだけです。
Dependency Walkerを使用して、欠落しているDLLを追跡します。
Dependency Walkerは、モジュールのロードと実行に関連するシステムエラーのトラブルシューティングにも非常に役立ちます。Dependency Walkerは、不足しているモジュール、無効なモジュール、インポート/エクスポートの不一致、循環依存エラー、モジュールのマシンタイプの不一致、モジュール初期化の失敗など、多くの一般的なアプリケーションの問題を検出します。
VSには、DLL を静的にリンクするためのコンパイル時オプションもあります。
Visual C ++の場合、再配布の処理方法にはいくつかの選択肢があります。インストーラーから(管理者権限で)EXEを実行するか、MSIマージモジュールをMSIインストーラーで使用するか、サイドバイサイドDLLを使用します。詳細については、MSDNを参照してください。
より大きな問題はOpenGLです。Windowsに含まれているOpenGLの唯一のバージョンは、OpenGL 1.5ソフトウェアレンダラーです。それ以外の場合は、サードパーティのICDをインストールする必要があります。
これは、非常に多くのWindowsゲームがオペレーティングシステムに含まれているため、代わりにDirectXを使用する理由の1つです。ゲーム開発者向けのDirect3D 11の展開をご覧ください。。直接セットアップではありません。
免責事項:これは回避策であり、回答の解決策ではありませんが、実行可能な可能性があります。
VS自体からの依存関係がないことを絶対に確認したい場合-それには独自の欠点があります-コード生成設定では、マルチスレッド(MT)/マルチスレッドデバッグ(MD)(デバッグビルド用)を選択できます)MT DLL(MTd)/ MT Debug DLL(MDd)の代わりに。
欠点は何ですか?
そして、長所は何ですか?
このリンクを確認してくださいより詳細な説明、および静的ランタイムの使用で発生する可能性のある落とし穴については、を。
別の回避策は、必要なDLLをすべてバイナリに配置することです。アプリケーションは(ランタイムライブラリへの)更新の恩恵を受けませんが、それだけです。
実際のソリューションは、アプリケーションをリリース/非デバッグDLLモード(MTd)で配布し、正しいVC ++再配布可能インストーラー(およびOpenAL、DirectX9、PhysXなどの使用可能なその他のライブラリーインストーラー)を提供し、ユーザーに実行させることです(他の回答が指摘したように)アプリケーションを実行する前に。
また、GPUドライバーを更新する必要がある可能性があることをユーザーに知らせるようにしてください(GPUドライバーには、OpenGL、Vulcanなどの多くのアプリケーションの複数のランタイムも含まれているため)。