2016/06/25
C++でOpenCVのフォームアプリを作る(3) - 静的リンク -
前回から苦戦していた、開発環境 OpenCV 3.1とVisual Studio 2015での「静的リンク」のその後の進捗です。結果から言うと、うまく行きました。私自身の理解が足りない所もありました。以下、その備忘録です。OpenCV 3.1では静的リンク用のライブラリが、OpenCV 3.0まで保存されていたstaticlibフォルダにありません。よって、CMakeでビルド用OpenCV.slnを作成する際にオプション設定(BUILD_SHARED_LIBSのチェックをOFF)して作成する必要があります。

作成されたStatic Link用のlibファイル(Release版)と、DLLファイルを利用するときのlibファイル(Release版)の容量は下表の通りです。ライブラリファイル名は同じですが、ファイル容量が異なります。当然、staticlink用のlibファイルの方が容量大です。imageprocはstaticlibにするだけで、62倍(6,200%)にもなるのですね。

Static Link用のlibファイルも無事に作成できましたので、動的リンク(DLLファイル利用)で問題なく動作していたプログラム(C++のフォームアプリ)を、静的リンクでビルドしてみました。・・しかし、リンクエラーのオンパレードでした。何が原因か切り分けるため、まずは、
① フォームなしのOpenCVのコード(C++)のみで確認する。次に
② フォームを付けて確認する
の2段階で攻めていくことにしました。
①は特定の画像のファイルをimreadで読み込んで、Windowに表示させる単純なものでしたが、OpenCV 3.1ではうまくいかなかったので、実績のあったOpenCV 2.4.10(Visual Studio 2010)で検証しました。
このプログラムをOpenCVのインストールされていないWindows Tabletで実行すると、無事に動作しました。OpenCV 3.1(Visual Studio 2015)でリンクを成功させるためには、OpenCV自身のバージョンアップによる変更点等を考慮する必要がありました。このことについては、次回お話しします。
//-------------------------------------------------------
// OpenCV 2.4.10 静的リンク
// リンカー設定:入力
// 特定の既定のライブラリを無視:Libcmt.lib;msvcprt.lib
//-------------------------------------------------------
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#pragma comment(lib, "comctl32.lib")
#pragma comment(lib, "vfw32.lib")
#pragma comment(lib, "opencv_core2410.lib")
#pragma comment(lib, "opencv_highgui2410.lib")
#pragma comment(lib, "opencv_imgproc2410.lib")
#pragma comment(lib, "zlib.lib")
#pragma comment(lib, "IlmImf.lib")
#pragma comment(lib, "libjasper.lib")
#pragma comment(lib, "libjpeg.lib")
#pragma comment(lib, "libpng.lib")
#pragma comment(lib, "libtiff.lib")
using namespace cv;
void main(void)
{
Mat readimage = imread("c:¥¥flower.bmp");
namedWindow("Read Image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
imshow("Read Image", readimage);
waitKey(0);
}
スポンサーサイト
コメント