6

SO に関する次の 2 つの質問を読みました。出荷するランタイム ライブラリはどれですか? GCCに含まれるランタイム ライブラリのライセンスは? - どちらも非常に役に立ちましたが、私が探していたものではありませんでした。

私は常に自分のマシンで使用するプログラムを作成しているだけで、問題が発生したことはありませんが、他のマシンでソフトウェアの実行を開始したいと考えており、実行時の要件に注意しています。

編集:代わりに以下の例を参照してください。これは誤解を招くものでした。

具体的には、Windows マシンで C++ プログラムを作成し、MinGW を使用して gcc でコンパイルし、それを別のマシンで実行したい場合:

  • プログラムと一緒に libstdc++.dll を送信する必要がありますか?
  • この単一のファイル (実行可能ファイルのディレクトリに配置されていると仮定します) は、プログラムを実行するのに十分ですか?

また、同じ例ですが、今回は Objective-C プログラムです。libobjc.dll ファイルを他のマシンに送信するだけで、プログラムを適切に実行できますか?

私は開発者ツールなどがインストールされたマシンでプログラムを実行することに慣れていましたが、今では汎用マシン (友人や同僚など) でプログラムを実行しようとしていますが、どうすればよいかよくわかりません!


編集: edificeの回答に応えて、探しているものを明確にする必要があると感じています。プログラムで使用する必要な DLL (/dylibs など) を特定する方法を知っています (ただし、その作業を手動で行うことに慣れていますが、どのツールについても聞いたことがありません)。私の質問は、「私は今何をしますか?」 でした。

より一般的な例がおそらく必要です。

C++、C および/または Objective-C(2) コードから派生したオブジェクト ファイルを含むプログラムを作成したとします。MinGW の gcc を使用して正常にコンパイルされた Windows API コードをいくつか使用しました。Visual Studio (C++) で作成したカスタム DLL もあります。

プログラムが実行時に使用する DLL を特定しました (そのうちの 1 つが GCC の libobjc.dll である可能性があります。これが Windows マシンで違いを生むかどうかはわかりませんが、できるだけ一般的なものにしたいと考えています)。 ) - 「前提条件の DLL」。

同僚のコンピューターで実行したいと思います。そのほとんどは Windows 7 を実行していますが、現在 Windows 8 を実行しているものもあります。完全を期すために最初から始めます。

  • 前提条件の DLLを同僚のコンピューターに転送する必要がありますか?
  • それらをどのディレクトリに配置すればよいですか? (exeディレクトリ/システムディレクトリ?)
  • これらの DLL が存在することで、プログラムを正しく実行できますか? (それらを見つける場所を知っていると仮定します)
  • DLL と一緒に転送する必要がある他のファイルはありますか?

基本的に私は、システムのランタイム要件の観点から、別のマシンでアプリケーションを開発および実行するための全体的な思考プロセスを決定しようとしています。

4

2 に答える 2

5

DLL をロードするとき、Windows が最初に検索する場所は、exe が入っているディレクトリです。したがって、そこに DLL を配置しても問題なく動作する可能性があります。

ただし、Microsoft DLL については、Microsoft の再配布可能なパッケージである Visual C++ ランタイムをインストールするよう同僚に依頼する方が理にかなっていると思います。理想的には、WiX のようなものを使用してインストーラーを作成し、その前提条件をインストールしますが、同僚にそれを行うように伝えるだけでも問題ありません。

gcc から DLL を含める場合は、ライセンス ファイルをソフトウェアに含めるようにしてください。これは、GPL で要求されているためです。

于 2012-12-29T08:53:33.050 に答える
3

libstdc++ は必ずしも十分ではありません。ほとんどの場合 libgcc も必要ですが、実際の依存関係は特定のアプリケーションによって異なる可能性があります。

アプリケーションに同梱する必要があるものを決定する最善の方法は、EXE をDependency Walkerなどのプログラムにロードすることです。

例として、単純に std::string を出力するテスト C++ プログラムをコンパイルしました。ご覧のとおり、Windows に付属するモジュール以外の2 つのモジュールに直接依存しています。libgcc_s_dw2-1.dllに加えてlibstdc++-6.dll

各 DLL の下にツリーを展開して、それ自体に他の依存関係がないことを確認することを忘れないでください (A が B に依存している場合、A が C に直接依存していなくても、B は C に依存している可能性があります)。

心配していて、最も強力な保証が必要な場合は、Windows を仮想マシン (VirtualBox は無料) にインストールして、その中でアプリケーションをテストできます。Microsoft API を使用している場合は、MSDN のドキュメントをチェックして、それらが導入された Windows のバージョンを確認し、それがターゲットの最小 Windows バージョンと一致していることを確認してください。

更新: xtofl指摘しているように、これは を使用して動的にロードされたライブラリをカバーしませんLoadLibrary。このベースをカバーしたい場合は、Process Monitor を使用して、アプリケーションの実行時にどの DLL ファイルが変更されるかを調べます。(あふれないように、EXE へのパスを含む「イメージ パス」基準を追加します。) これには、DLL だけでなく、アプリケーションが依存するすべてのファイル、レジストリ エントリなどをカバーするという追加の利点があります。

于 2012-12-27T07:48:50.100 に答える