OpenCV を静的リンクしたい (Windows)


[戻る]

1. 概要

Windows で OpenCV を静的リンクする方法について解説します。

OpenCV のドキュメント『OpenCV プログラミングブック』 などには、OpenCV を DLL で使う方法しか書かれていません。また、OpenCV の配布パッケージには、 静的ライブラリが含まれていません。

しかし、OpenCV を利用したアプリケーションを一般ユーザーに配布する場合、 OpenCV の DLL が複数あって煩雑であることや、アプリケーションの実行に Visual C++ ランタイムが必要になるなどの理由で、 静的リンクしたいということがあります。

そこでここでは、OpenCV の配布パッケージから静的ライブラリをビルドする方法と、 その静的ライブラリを利用したアプリケーションを作成する方法を解説します。 それから、Visual C++ のランタイムに静的にリンクするようにします。

なお、動作環境は以下のとおりです。

2. OpenCV 静的ライブラリのビルド

OpenCV のインストール

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 プロパティ ページ] ダイアログで、次のように変更します。

  1. [構成プロパティ]-[全般]-[構成の種類] を「スタティック ライブラリ (.lib)」にします。
  2. [構成プロパティ]-[C/C++]-[コード生成]-[ランタイム ライブラリ] を「マルチスレッド (/MT)」にします。

cvaux, cxcore などの他の 11個のライブラリも、同様に設定します。 libjasper, libjpeg などのライブラリは最初から「スタティック ライブラリ (.lib)」になっていますが、 念のため全部確認しておきましょう。

cvsample, cvtest, cxcoretest の 3個はアプリケーションなので、次のように変更します。

  1. [構成プロパティ]-[C/C++]-[コード生成]-[ランタイム ライブラリ] を「マルチスレッド (/MT)」にします。
  2. [構成プロパティ]-[リンカ]-[全般]-[追加のライブラリ ディレクトリ] を lib ディレクトリへの参照ではなく "$(SolutionDir)Release_Static" にします (二重引用符は入力しない)。

こうして 14個全部のプロジェクトの設定を変更しましょう。

ソリューションをビルドする

[ソリューション エクスプローラ] 内のソリューションを右クリックして、 [ソリューションのビルド] メニューを選択すると、ビルドが始まります。 ビルドが終わるまで待ちましょう。

ビルドが終わると、下図のような5つのエラーが出ます。 1つ1つ解決していきましょう。

ソースコードの修正

1番目と2番目のエラーは、 C:\OpenCV\cvaux\src\cvbgfg_acmmm2003.cpp で起きています。 foreground_regions というメンバがないと言われています。 これは、ソースコード自体のミスでしょうから、 単純にコメントアウトしてしまいましょう。(^^)

再度、ソリューションをビルドしてみましょう。

すると C:\OpenCV\cvaux\src\cvbgfg_gaussmix.cpp で同じエラーが出ますので、コメントアウトして、 もう一度ソリューションをビルドしましょう。

まだエラーが出ますね。

comctl32.lib のリンク

このエラーは、「highgui.lib を cvsample.exe や cvtest.exe にリンクしようとしましたが、 highgui.lib が参照している CreateToolbarEx 関数が見つからない」という意味です。

Windows SDK で調べると分かるように、この関数は Windows API の1つであり、 comctl32.lib (Visual C++ または Windows SDK に付属) で定義されています。

したがって cvsample と cvtest のプロジェクトの構成で、このライブラリを追加するようにします。

  1. [構成プロパティ]-[リンカ]-[入力]-[追加の依存ファイル] に comctl32.lib を追加します。

再度、ソリューションをビルドしてみましょう。 これでうまくいきました。


cvsample が静的リンクされていることの確認

上記でビルドした cvsample が静的リンクしていることを確認しましょう。

Visual C++ や Windows SDK に付属している Depends.Exe を起動して、 今ビルドした C:\OpenCV\samples\c\cvsample.exe を開きます。

下図のように、確かに OpenCV が静的リンクされていることが分かります。 Visual C++ ランタイムも静的リンクされていることが分かります。

3. 自前のアプリケーションに静的リンクする

TestStatic プロジェクトの作成

上記の手順では、OpenCV に付属のサンプル プログラムで静的リンクできることが確認できました。

今度は、自前のアプリケーションに静的リンクしてみましょう。

ここでは TestStatic というアプリケーションを作成して実験してみましょう。

Visual C++ で普通にプロジェクトを作成します。ここでは「Win32 コンソール アプリケーション」を作成します。 簡単のため「プリコンパイル済みヘッダー」を使わないでおきますが、使っても問題ありません。

TestStatic フォルダの構成

次に 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.libC:\OpenCV\_make\release_static\
cvaux.libC:\OpenCV\_make\release_static\
cxcore.libC:\OpenCV\_make\release_static\
cxts.libC:\OpenCV\_make\release_static\
highgui.libC:\OpenCV\_make\release_static\
ml.libC:\OpenCV\_make\release_static\
libjasper.libC:\OpenCV\otherlibs\_graphics\lib\
libjpeg.libC:\OpenCV\otherlibs\_graphics\lib\
libpng.libC:\OpenCV\otherlibs\_graphics\lib\
libtiff.libC:\OpenCV\otherlibs\_graphics\lib\
zlib.libC:\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 のプロパティを次のように設定します。

  1. [構成プロパティ]-[C/C++]-[全般]-[追加のインクルード ディレクトリ] に "$(SolutionDir)OpenCV\include" を追加します。
  2. [構成プロパティ]-[C/C++]-[コード]-[ランタイム ライブラリ] を 「マルチスレッド (/MT)」に設定します。
  3. [構成プロパティ]-[リンカ]-[全般]-[追加のライブラリ ディレクトリ] に "$(SolutionDir)OpenCV\static" を追加します。
  4. [構成プロパティ]-[リンカ]-[入力]-[追加の依存ファイル] に "cv.lib cvaux.lib cxcore.lib cxts.lib highgui.lib comctl32.lib" を追加します。

ソリューションのビルド

ソリューションをビルドしてみましょう。正常に完了するはずです。

ちなみに、単純なコードでも実行ファイルは Release ビルドで 1.6MB にもなりました。

4. ダウンロード

以上のような作業が面倒くさいという方のために、TestStatic のソースコードを次からダウンロードできます。

これをベースにすれば、すぐに静的リンクされたアプリケーションを開発できます。

TestStatic.zip [6.2MB]


[戻る]