paroponの日記

興味のある技術の覚え書きです

OpenCVをスタティックリンク

OpenCVで作ったプログラムを別のPCで使おうとするといろんなDLLがないといわれてしまうので、スタティックリンクで使うメモです。
スタティックリンクにすることで実行ファイルのサイズは大きくなりますが、DLLのパスを通す必要がなくなります。

OS:Win8.1 64bit

Visual Studio 2013 Express

OpenCV 2.4.9

VCのDLLはこの記事の設定でスタティックリンクできるようです。

Visual C++が入っていないPCで実行 - インコのWindowsSDK

簡単にまとめると、プロジェクトのプロパティから構成プロパティ→C/C++→コード生成で、ランタイムライブラリをReleaseならマルチスレッドに、Debugならマルチスレッドデバッグに変更します。

OpenCVのスタティックリンクはこの記事を参考にさせていただきました。

【OpenCV】スタティックリンクライブラリの使用方法 | イメージングソリューション


私の環境では

Libcmt.lib;msvcprt.lib を無視する設定は不要でした。


ライブラリ周りの設定は少し変更しました。

//プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに
// opencv2のあるフォルダ(C:\opencv\build\includeなど)を追加のこと
#include "opencv2\opencv.hpp"

#pragma comment(lib,"comctl32.lib")
#pragma comment(lib,"vfw32.lib")

// バージョン名の取得
#define CV_VERSION_STR CVAUX_STR(CV_MAJOR_VERSION) CVAUX_STR(CV_MINOR_VERSION) CVAUX_STR(CV_SUBMINOR_VERSION)

// libファイル名の最後の部分をReleaseとDebugで分ける
#ifdef _DEBUG
#define CV_EXT_STR "d.lib"
#else
#define CV_EXT_STR ".lib"
#endif

//プロジェクトのプロパティ⇒リンカー⇒全般 の追加のライブラリディレクトリに
// libファイルのあるフォルダ(C:\opencv\build\x86\vc10\libなど)を追加のこと
#pragma comment(lib, "opencv_calib3d"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_contrib"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_core"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_features2d"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_flann"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_gpu"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_highgui"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_imgproc"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_legacy"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_ml"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_nonfree"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_objdetect"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_ocl"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_photo"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_stitching"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_superres"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_ts"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_video" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_videostab" CV_VERSION_STR CV_EXT_STR)

#pragma comment(lib, "zlib" CV_EXT_STR)
#pragma comment(lib, "IlmImf"   CV_EXT_STR)
#pragma comment(lib, "libjasper"CV_EXT_STR)
#pragma comment(lib, "libjpeg"  CV_EXT_STR)
#pragma comment(lib, "libpng"   CV_EXT_STR)
#pragma comment(lib, "libtiff"  CV_EXT_STR)

これでビルドまでできました。

基本的な動作も確認できました。が、、

DLL版では読み込めるAVIファイルのロードができませんでした。

    cv::VideoCapture cap(filename);
    if (!cap.isOpened())
    {
        printf("can't avi open\n");
        return;
    }


このあたりが似た問題かなと思いつつ
OpenCV VideoCapture fails to load compressed video files when building with staticlib - Stack Overflow

build\x64\vc12\binディレクトリにある
opencv_ffmpeg249_64.dll
をexeと同じ場所に置く必要があるようです。
これもスタティックリンクできないものか。。