Windows で OpenCV を静的リンクする方法について解説します。
OpenCV のドキュメント や 『OpenCV プログラミングブック』 などには、OpenCV を DLL で使う方法しか書かれていません。また、OpenCV の配布パッケージには、 静的ライブラリが含まれていません。
しかし、OpenCV を利用したアプリケーションを一般ユーザーに配布する場合、 OpenCV の DLL が複数あって煩雑であることや、アプリケーションの実行に Visual C++ ランタイムが必要になるなどの理由で、 静的リンクしたいということがあります。
そこでここでは、OpenCV の配布パッケージから静的ライブラリをビルドする方法と、 その静的ライブラリを利用したアプリケーションを作成する方法を解説します。 それから、Visual C++ のランタイムに静的にリンクするようにします。
なお、動作環境は以下のとおりです。
OpenCV をインストールするところから始めましょう。 OpenCV を配布しているサイト から Windows 版パッケージをダウンロードします。
ここでは opencv-win-1.1pre1 のインストーラ ( OpenCV_1.1pre1a.exe ) をダウンロードして実行します。
以下の解説では C:\OpenCV にインストールしたことを前提にします。
C:\OpenCV\_make\opencv.vs2005.no_openmp.sln を開きます。
14個のプロジェクトがありますが、OpenCV のライブラリは 11個であり、残り 3個は、 サンプルやテストなどの実行ファイルです。
cv | ライブラリ | |
cvaux | ライブラリ | |
cvsample | アプリケーション | |
cvtest | アプリケーション | |
cxcore | ライブラリ | |
cxcoretest | アプリケーション | |
cxts | ライブラリ | |
highgui | ライブラリ | |
libjasper | ライブラリ | |
libjpeg | ライブラリ | |
libpng | ライブラリ | |
libtiff | ライブラリ | |
ml | ライブラリ | |
zlib | ライブラリ |
11個のライブラリの設定を変更すれば、静的ライブラリがビルドできますが、以降の手順では、 念のため残り 3個の実行ファイルもビルドし、静的ライブラリにリンクされることを確認するようにしましょう。
デフォルト状態では、Release と Debug というソリューション構成があり、 どちらも DLL としてビルドするように構成されています。
まずは、静的ライブラリをビルドするための Release_Static というソリューション構成を新しく作成しましょう。
[ソリューション エクスプローラ] 内のソリューションを右クリックして、 [構成マネージャ...] メニューを選択します。 すると下図のような [構成マネージャ] ダイアログが表示されます。
このダイアログの [アクティブ ソリューション構成] ドロップダウンリストから、 「<新規作成...>」を選択しますと、[新しいソリューション構成] というダイアログが 表示されますので、[名前] に Release_Static と入力し、[設定のコピー元] から Release を選択します。 [新しいプロジェクト構成を作成する] チェックボクスはオンにします。これで [OK] ボタンを押します。
[構成マネージャ] ダイアログに戻りますので、 [アクティブ ソリューション構成] が Release_Static になっていることを確認した上で、 [閉じる] ボタンを押します。
各プロジェクトの構成を変更して、静的ライブラリをビルドするようにします。
たとえば、一番最初の cv プロジェクトの構成を変更するには、 [ソリューション エクスプローラ] から cv プロジェクトを右クリックして [プロパティ] メニューを選択し、[cv プロパティ ページ] ダイアログで、次のように変更します。
cvaux, cxcore などの他の 11個のライブラリも、同様に設定します。 libjasper, libjpeg などのライブラリは最初から「スタティック ライブラリ (.lib)」になっていますが、 念のため全部確認しておきましょう。
cvsample, cvtest, cxcoretest の 3個はアプリケーションなので、次のように変更します。
こうして 14個全部のプロジェクトの設定を変更しましょう。
[ソリューション エクスプローラ] 内のソリューションを右クリックして、 [ソリューションのビルド] メニューを選択すると、ビルドが始まります。 ビルドが終わるまで待ちましょう。
ビルドが終わると、下図のような5つのエラーが出ます。 1つ1つ解決していきましょう。
1番目と2番目のエラーは、 C:\OpenCV\cvaux\src\cvbgfg_acmmm2003.cpp で起きています。 foreground_regions というメンバがないと言われています。 これは、ソースコード自体のミスでしょうから、 単純にコメントアウトしてしまいましょう。(^^)
再度、ソリューションをビルドしてみましょう。
すると C:\OpenCV\cvaux\src\cvbgfg_gaussmix.cpp で同じエラーが出ますので、コメントアウトして、 もう一度ソリューションをビルドしましょう。
まだエラーが出ますね。
このエラーは、「highgui.lib を cvsample.exe や cvtest.exe にリンクしようとしましたが、 highgui.lib が参照している CreateToolbarEx 関数が見つからない」という意味です。
Windows SDK で調べると分かるように、この関数は Windows API の1つであり、 comctl32.lib (Visual C++ または Windows SDK に付属) で定義されています。
したがって cvsample と cvtest のプロジェクトの構成で、このライブラリを追加するようにします。
再度、ソリューションをビルドしてみましょう。 これでうまくいきました。
上記でビルドした cvsample が静的リンクしていることを確認しましょう。
Visual C++ や Windows SDK に付属している Depends.Exe を起動して、 今ビルドした C:\OpenCV\samples\c\cvsample.exe を開きます。
下図のように、確かに OpenCV が静的リンクされていることが分かります。 Visual C++ ランタイムも静的リンクされていることが分かります。
上記の手順では、OpenCV に付属のサンプル プログラムで静的リンクできることが確認できました。
今度は、自前のアプリケーションに静的リンクしてみましょう。
ここでは TestStatic というアプリケーションを作成して実験してみましょう。
Visual C++ で普通にプロジェクトを作成します。ここでは「Win32 コンソール アプリケーション」を作成します。 簡単のため「プリコンパイル済みヘッダー」を使わないでおきますが、使っても問題ありません。
次に TestStatic のフォルダ構成を以下のようにしましょう。
TestStatic // ソリューション フォルダ │ TestStatic.sln // ソリューション ファイル │ ├─OpenCV // OpenCV のためのフォルダ │ ├─include // OpenCV のインクルード ファイルを入れる │ └─static // OpenCV のライブラリ ファイルを入れる │ └─TestStatic // TestStatic プロジェクトのフォルダ stdafx.cpp stdafx.h TestStatic.cpp TestStatic.vcproj
先ほどビルドした OpenCV の静的ライブラリをコピーして、ソリューションに統合してしまいましょう。 以下のファイルをすべてコピーして TestStatic\OpenCV\static の中に放り込みましょう。
ライブラリ | 場所 |
---|---|
cv.lib | C:\OpenCV\_make\release_static\ |
cvaux.lib | C:\OpenCV\_make\release_static\ |
cxcore.lib | C:\OpenCV\_make\release_static\ |
cxts.lib | C:\OpenCV\_make\release_static\ |
highgui.lib | C:\OpenCV\_make\release_static\ |
ml.lib | C:\OpenCV\_make\release_static\ |
libjasper.lib | C:\OpenCV\otherlibs\_graphics\lib\ |
libjpeg.lib | C:\OpenCV\otherlibs\_graphics\lib\ |
libpng.lib | C:\OpenCV\otherlibs\_graphics\lib\ |
libtiff.lib | C:\OpenCV\otherlibs\_graphics\lib\ |
zlib.lib | C:\OpenCV\otherlibs\_graphics\lib\ |
OpenCV のインクルード ファイルをコピーして、ソリューションに統合してしまいましょう。 以下のファイルをすべてコピーして TestStatic\OpenCV\include の中に放り込みましょう。
C:\OpenCV\cv\include\* C:\OpenCV\cvaux\include\* C:\OpenCV\cxcore\include\* C:\OpenCV\otherlibs\highgui\highgui.h
TestStatic のプロパティを次のように設定します。
ソリューションをビルドしてみましょう。正常に完了するはずです。
ちなみに、単純なコードでも実行ファイルは Release ビルドで 1.6MB にもなりました。
以上のような作業が面倒くさいという方のために、TestStatic のソースコードを次からダウンロードできます。
これをベースにすれば、すぐに静的リンクされたアプリケーションを開発できます。
TestStatic.zip [6.2MB]