「DLLが見つからない」問題を取り除くにはどうすればよいですか?


15

Visual C ++ 2015とOpenGLでいくつかのゲームを作成しました。自分のマシンで実行しても問題はありませんでしたが、他のマシンで実行すると、いくつかのDLLが欠落していることがわかります。ファイルが見つからないという問題を回避できるように、次回はそれが発生しないことを確認する方法と、どのようなことを考慮する必要があるのか​​を知りたいですか?


8
最初に、リリースバージョンをビルドしていることを確認します。
user253751

3
VS自体からの依存関係がないことを絶対に確認したい場合-それには独自の欠点があります-コード生成設定では、MT DLL / MTデバッグDLL。実行可能ファイルのサイズは増加しますが、この方法でコンパイルされたバイナリはランタイムDLLの更新の恩恵を受けません。しかし、それはあなた次第です。プラス面は、実行可能ファイルに「外部」依存関係がないことです。これはあなたの問題の解決策ではなく、単なる回避策であるため、これを回答として投稿しません。
ギズモ

@Gizmoの回避策は依然として回答であり、コメントは一時的なものであり、下にある投稿を明確にするために使用され、削除される場合があります。役に立つ場合は、回答として投稿してください。
user1306322

わかった。それから回答として投稿します。
ギズモ

回答:


22

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機能のサブセットに制限されます。これは一般に、あらゆる種類の意味のあるゲームや大規模なアプリケーションを作成するには不十分です。インストーラー自体は、実行するために依存関係を必要としないアプリケーションの例です。


VSを使用してこのようなインストーラーをビルドすることはできますか?プロジェクトの設定でOneClickと呼ばれるものを見たことがあると思いました。
user1306322

@ user1306322:絶対に、1つの解決策がギズモの質問のコメントで言及されました。リンクするランタイム/ DLLの問題です。デフォルト設定では、バージョン固有のCRT DLLにリンクしていますが、リンカーオプションをいじることで変更できます。MSVCRT.DLLMSVCPxxx.DLLVisual Studioリリースに含まれているバージョン固有のバージョン)ではなく(Windows自体に含まれている)に対してリンクするだけです。
ショーンミドルディッチ

または、完全なインストーラーを構築することを意味する場合、それは基本的にWIXです。これは典型的な過度に複雑なXMLを多用するMicrosoft crapfestですが、動作します。私はそれらが2013年か2015年以来なくなっていると信じていてもそこにも「プロジェクトインストーラ」にするために使用
ショーンMiddleditch

7

Dependency Walkerを使用して、欠落しているDLLを追跡します。

Dependency Walkerは、モジュールのロードと実行に関連するシステムエラーのトラブルシューティングにも非常に役立ちます。Dependency Walkerは、不足しているモジュール、無効なモジュール、インポート/エクスポートの不一致、循環依存エラー、モジュールのマシンタイプの不一致、モジュール初期化の失敗など、多くの一般的なアプリケーションの問題を検出します。


VSには、DLL を静的にリンクするためのコンパイル時オプションもあります。

  • 静的リンクは、DLLがEXEファイルに含まれることを意味します。
  • 静的にリンクすると、EXEファイルのサイズが大きくなります。
  • 静的リンクは、このバージョンのDLLが常に使用されることを意味します。
  • ただし、静的にリンクすると、DLLが見つからないという問題が発生しなくなります。

1
依存関係ウォーカーはかなり古いです。DLLをロードするためのWindowsのメカニズムを適切にエミュレートしません。多くの場合、DLLが見つからないという偽のメッセージが表示されます。
-jpmc26

また、依存関係のライセンスでは静的リンクが禁止されている場合があります。
KeyWeeUsr

6

Visual C ++の場合、再配布の処理方法にはいくつかの選択肢があります。インストーラーから(管理者権限で)EXEを実行するか、MSIマージモジュールをMSIインストーラーで使用するか、サイドバイサイドDLLを使用します。詳細については、MSDNを参照してください。

より大きな問題はOpenGLです。Windowsに含まれているOpenGLの唯一のバージョンは、OpenGL 1.5ソフトウェアレンダラーです。それ以外の場合は、サードパーティのICDをインストールする必要があります。

これは、非常に多くのWindowsゲームがオペレーティングシステムに含まれているため、代わりにDirectXを使用する理由の1つです。ゲーム開発者向けのDirect3D 11の展開をご覧ください。直接セットアップではありません


1
OpenGLのアドバイスは時代遅れです。最新のグラフィックスドライバーにはすべて、最新のOpenGL ICDが付属しています。
user253751

個人的には古い年と少しとマシン上でOpenGLのDLLをインストールする必要がありましたアイブ
Gnemlock

@Gnemlock前述の1年前のコンピューターにWindowsを再インストールした直後、あなたは正しいかもしれません。NVIDIA、AMD、またはIntelから公式ドライバーパッケージをインストールした後、この問題が引き続き発生しましたか?
ダミアンジェリック

2
@Gnemlock-OpenGL DLLを手動でインストールする場合、恐ろしく間違った何かをしていることになります。実際に「GPUベンダーのドライバーをインストールする」という意味であれば、それはまさにimmibisが言ったことでもあります。
マキシマスミニマス

@Gnemlock-ああ、だから現実の世界には関係ない。それを片付けてくれてありがとう。
マキシマスミニマス

1

免責事項:これは回避策であり、回答の解決ではありませんが、実行可能な可能性があります。

VS自体からの依存関係がないことを絶対に確認したい場合-それには独自の欠点があります-コード生成設定では、マルチスレッド(MT)/マルチスレッドデバッグ(MD)(デバッグビルド用)を選択できます)MT DLL(MTd)/ MT Debug DLL(MDd)の代わりに。

ここに画像の説明を入力してください

欠点は何ですか?

  • 実行可能ファイルのサイズとバイナリが増加します(ただし、ゲームを作成している場合はおそらく無視できます)
  • この方法でコンパイルすると、ランタイムDLLの更新の恩恵を受けません。(たとえば、MicrosoftがVC ++ 2015 SP2、SP3、SP4などをリリースした場合。)しかし、それはあなた次第です。
  • 既存/ロードされたコード(DLL)を再使用しないため、RAMの使用量が増えます(これも無視できます)
  • リンクするすべてのライブラリが同じランタイムに対してコンパイルされていることを確認する必要があります。そうしないと、リンクが失敗するか、興味深いランタイムエラーが発生する可能性があります(おそらくそうではありませんが、最新のVS)

そして、長所は何ですか?

  • 実行可能ファイルには、VS自体からの「外部」依存関係はありません(msvc * .dllの要件はありません)。
  • DLL呼び出しのオーバーヘッドを排除しているため、これはパフォーマンスの向上とみなされる人もいます。これは理論的には事実ですが、実際の改善はごくわずかです

このリンクを確認してくださいより詳細な説明、および静的ランタイムの使用で発生する可能性のある落とし穴については、を。

別の回避策は、必要なDLLをすべてバイナリに配置することです。アプリケーションは(ランタイムライブラリへの)更新の恩恵を受けませんが、それだけです。

実際のソリューションは、アプリケーションをリリース/非デバッグDLLモード(MTd)で配布し、正しいVC ++再配布可能インストーラー(およびOpenAL、DirectX9、PhysXなどの使用可能なその他のライブラリーインストーラー)を提供し、ユーザーに実行させることです(他の回答が指摘したように)アプリケーションを実行する前に。

また、GPUドライバーを更新する必要がある可能性があることをユーザーに知らせるようにしてください(GPUドライバーには、OpenGL、Vulcanなどの多くのアプリケーションの複数のランタイムも含まれているため)。


0

私の解決策は、エラーの原因となったDLLをVisual Studioの.slnファイルがあるフォルダーにコピーして貼り付けることでした。#includeセクションの後、私は#pragma comment (lib, "lost DLL name with .dll")それを書いて解決しました!

注:サードパーティライブラリ(vulkan api)DLLで発生した問題を解決しました。多分それは知られていないが、90%が幸運に働くだろう

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.