web-dev-qa-db-ja.com

exeファイルにすべてのdllを含める方法は?

Visual Studio12プロジェクトがあります。 C++で書かれたソースコード。それはOpenCVプロジェクトです。コンパイルしたプログラムを他の人に渡したいのですが、他のPCで、いくつかのdllが見つからないというエラーメッセージが表示されます。多くのOpenCV(多分それだけではない)dllを使用している私のプログラム。 どうすればその問題を解決できますか?おそらくVS 12では、すべてのdllを.exeに含めるオプションが利用できますか?これは、適切な回答がない非常によく似た質問です: Visual Studio C++ 2008にdllを含める

7
Pavlo Zvarych

DLL自体を実行可能ファイルに「静的にリンク」することはできません。それは彼らの目的に完全に反します(まあ、実際にはいくつかの本当に奇妙なブードゥートリックを使って実際にそれを行うことができますが、これはお勧めできませんし、この質問をする必要がある場合は試してみるべきではありません)。

簡単な解決策は、プログラムに必要なすべてのDLLを特定し(デバッガーでプログラムを起動するだけで、それらすべてを一覧表示するログファイルが生成されます)、それらのDLLをEXEが存在するのと同じディレクトリにコピーすることです。たまたま、EXEファイルが含まれているディレクトリは、システムがデフォルト構成の標準システムディレクトリに進む前にDLLを探す最初のディレクトリでもあります。パッケージ化して、そのように配布します。

12
datenwolf

より複雑な解決策は、srcから静的opencvライブラリを構築し、それらに対してプログラムをリンクして、dllを使用しない1つの大きなバイナリexeチャンクを作成することです(ffmpegを除いて、それについてはよくわかりません)。

静的ライブラリをビルドするには、次のコマンドでcmakeを実行する必要があります:BUILD_SHARED_LIBS = OFF

しかし、それをする前に、深呼吸してください。プログラムのリンクは非常に難しくなります。これは、依存関係が何であれ、すべてのzlib、libpngを手動でリンクする必要があるためです(以前はdllに便利にリンクされていました)。

繰り返しますが、最も簡単な解決策は、すべてのopencvdllをプログラムにデプロイすることです。

4
berak

Windows Dependency Walker を使用して、プログラムで実行する必要のあるDLLを判別できます。

実際、これは、プログラムを正常に起動するために必要なDLLのみを示します。 (LoadLibraryを介して)DLLを動的にロードする場合は、自分で行う必要があります。

3
Ferruccio

受け入れられているソリューションを選択し(DLLをEXEファイルと一緒にパッケージ化する)、使用するDLLを見つける手間をかけたくない場合は、すべてのOpenCVDLLをコピーできます。それらはそれほど大きくはありません(OpenCV2.43では65MB)。それらは...\opencvXXX\build\x64\vc10\bin\にあります

ここで、XXXはOpenCVバージョンです。プラットフォーム(32ビットまたは64ビット)に応じて、x64またはx86を使用できます。また、vcのバージョンはシステムによって異なる場合があります(vc9vc10など...)

1
Hazem