4


1

外部ライブラリを使用したOpenCV c ++アプリケーションの展開

私は幸運なしにこれをたくさん探しました(おそらく正しい技術用語を使っていないからです)。 私の問題は、主に静的ライブラリのリンク、コンパイル、デプロイに関するものです。 詳細に入る前に、実行可能ファイルはシステムで正常にコンパイルされます。主な問題は、これらを他のユーザーへの実用的なソリューションとして展開する方法です。

OpenCV静的ライブラリを使用する基本的なc 画像処理exeを作成しました(標準としてProject> Properties> Linker>追加の依存関係を使用してVC でこれらをリンクします)。 VC ++オプションを設定して、正しいインクルードファイルを指定してコンパイルします…​ 基本的に、すべて正常にコンパイルされます。 これを別のPCに展開できるようにしたいと思います。 私はexeのリリースバージョン+静的ライブラリが必要になることを理解しています…​ 他に何かありますか?

一部のライブラリは、libjpegとlibpngの使用に依存しています。これらが標準として含まれているとは思わない。 また、静的ライブラリへのリンカーパスを相対パスに設定しました(例: リソース/ libs)ので、システムに依存しないので、libsを見つける場所を知っています。 基本的なOpenCVデータ構造は正常に機能しています(例: CvPoint)が、CvLoadImageを使用して画像をロードしようとすると、アプリケーションがクラッシュします。 代わりに標準のifstream fopenを使用すると、問題なくファイルを開くことができます(ただし、IplImage OpenCVイメージストラットにファイルを取得できないようです-誰でもこれらの方法を知っていますか? おそらくIplImage→ imageDataを使用してください。)。

任意の助けは非常に高く評価しました。 ありがとうございます。

1 Answer


1


静的ライブラリは、アプリケーションとともに配布する必要はありません(配布すべきではありません)。 静的ライブラリは、リンカーによってexeファイルに組み込まれます。

OpenCVがクラッシュする理由は、libpng / libjpeg dllが見つからないためです。 OpenCVはそれらを静的な依存関係としてリンクしませんが、代わりに実行時にLoadLibrary / dlopen APIを使用します。 これらの呼び出しが失敗した場合、おそらく素晴らしい回復はなく、アプリケーションはクラッシュします。 libpng / libjpegライブラリを含める場合、問題を修正する必要があります。

また、注意してください-いくつかの.libファイルは真に静的なライブラリではありませんが、リンカーがDLL内の適切な関数を見つけて動的リンクコードを生成できるようにする薄いレイヤーであるため、プログラマーが手動で行う必要はありません。 通常、かなり小さい.libファイルサイズから、exeの起動時にDLLエントリポイントが見つからないとアプリケーションが叫ぶことがわかります。