當我們需要測試程序,或者想將程序發給其他同事或者同學,以讓同事或者同學運行以測試程序性能或者邏輯是否恰當時,是不是還要他人也要像你當初開發程序時一樣一步一步的配置OpenCV運行環境!?如果不做這些,還會提示像圖1所示的系統錯誤(無法啟動程序,因為計算機中丟失“opencv_highgui241d.dll。嘗試重新安裝該程序以解決此問題”),這是不是太麻煩了,其實我們可以將程序以靜態鏈接的方式編譯,如此便少去了配置運行時環境的步驟了。
圖1 動態編譯的程序在未配置OpenCV的機器上運行提示系統錯誤
靜態編譯,也就是說編譯後的程序可以直接拷貝到其他機器上並能直接運行。而不需附帶鏈接庫和配置環境變量。
由於OpenCV自2.3.0版本開始就提供了OpenCV-2.3.x -win-superpack.exe或OpenCV-2.4.x.exe文件,該文件解壓後我們會發裡面有個名為“build”的文件夾,其中有各個平台的鏈接庫,而且還提供了Windows平台下的靜態鏈接庫,本文主要講述一個例子以說明如何配置使用該靜態鏈接庫。
像前面(OpenCV2.3.x/2.4.x在Visual Studio2005/2008和Visual Studio2010配置方法詳解 http://www.linuxidc.com/Linux/2012-08/68302.htm)放置OpenCV庫文件配置VC++目錄選項,並且配置環境變量(這一步可以不配置,但要在VC++目錄中將OpenCV的“bin”目錄添加到“VC++ 可執行文件”目錄選項中),注意這裡使用的庫目錄是“staticlib”而不是“lib”,這裡不多贅述。
配置完Visual Studio 2008中的VC++目錄後便可以編寫代碼了。
(1)編輯代碼
“新建項目”,選擇“Visual C++-空項目”,輸入項目名“StaticOpenCV”,“添加新項-代碼-C++ 文件”,輸入文件名“StaticOpenCV.cpp”,編輯代碼,這裡本人使用的測試代碼如下所示:
- #include <opencv/highgui.h>
-
- int main( int argc, char** argv ) {
- IplImage*img = cvLoadImage( argv[1] );
- cvNamedWindow("OpenCV", CV_WINDOW_AUTOSIZE );
- cvShowImage("OpenCV", img );
- cvWaitKey(0);
- cvReleaseImage(&img );
- cvDestroyWindow("OpenCV" );
-
- return( 0 );
- }
(2)添加附加依賴項有兩種方法,見《
OpenCV 2.3.x/2.4.x在Visual Studio 2005/2008和Visual Studio 2010配置方法詳解》一文。
OpenCV-2.4.1庫文件列表(使用的時候適當選擇,這裡我要用的是libjasperd.lib、libjpegd.lib、libpngd.lib"、libtiffd.lib、zlibd.lib(注意這幾個必須要用的,因為這些是OpenCV所使用的第三方庫)和opencv_highgui241d.lib、opencv_core241d.lib庫文件。
- libjasper.lib
- libjasperd.lib
- libjpeg.lib
- libjpegd.lib
- libpng.lib
- libpngd.lib
- libtiff.lib
- libtiffd.lib
- opencv_calib3d241.lib
- opencv_calib3d241d.lib
- opencv_contrib241.lib
- opencv_contrib241d.lib
- opencv_core241.lib
- opencv_core241d.lib
- opencv_features2d241.lib
- opencv_features2d241d.lib
- opencv_ffmpeg241.dll
- opencv_flann241.lib
- opencv_flann241d.lib
- opencv_gpu241.lib
- opencv_gpu241d.lib
- opencv_haartraining_engine.lib
- opencv_haartraining_engined.lib
- opencv_highgui241.lib
- opencv_highgui241d.lib
- opencv_imgproc241.lib
- opencv_imgproc241d.lib
- opencv_legacy241.lib
- opencv_legacy241d.lib
- opencv_ml241.lib
- opencv_ml241d.lib
- opencv_nonfree241.lib
- opencv_nonfree241d.lib
- opencv_objdetect241.lib
- opencv_objdetect241d.lib
- opencv_photo241.lib
- opencv_photo241d.lib
- opencv_stitching241.lib
- opencv_stitching241d.lib
- opencv_ts241.lib
- opencv_ts241d.lib
- opencv_video241.lib
- opencv_video241d.lib
- opencv_videostab241.lib
- opencv_videostab241d.lib
- zlib.lib
- zlibd.lib
為方便我們知道到我們到底需要使用哪些庫文件,這裡我們使用《OpenCV2.3.x/2.4.x在Visual Studio2005/2008和Visual Studio2010配置方法詳解 http://www.linuxidc.com/Linux/2012-08/68302.htm》一文中所講述的第二種方法添加程序依賴庫。我們在頭文件與主函數之間添加如下代碼:
- #pragma comment( lib,"libjasperd.lib" )
- #pragma comment( lib,"libjpegd.lib" )
- #pragma comment( lib,"libpngd.lib" )
- #pragma comment( lib,"libtiffd.lib" )
- #pragma comment( lib, "zlibd.lib")
-
- #pragma comment( lib,"opencv_highgui241d.lib" )
- #pragma comment( lib,"opencv_core241d.lib" )
編譯程序,會發發現程序不能正常編譯(錯誤如圖2所示),這主要與MSVCRT.lib(MSVCR90.dll)有關。
圖2 編譯產生很多錯誤