opencv 2.1 與opencv 2.4.4靜態編譯(主要是opencv 2.1)

半年前總結的心得,雖然現在opencv高級版本都自帶了靜態庫,但是還是想把我的經驗和大家分享。當然,其中很大一部分也參雜了其他人的經驗。

編譯靜態庫需要的工具及文件:

1.VS2010

2.OpenCV源碼包(OpenCV-2.1.0)

3.Cmake2.8.9  http://www.cmake.org/cmake/resources/software.html

 

1.運行OpenCV源碼包,安裝到D:\OpenCV-2.1.0

 

2.安裝Cmake並打開設置

Where is the rource code  :OpenCV源代碼所在的文件夾

Where to build the binaries:CMake配置好得到的文件放在位置D:\OpenCV-2.1.0\OpenCV-Cmake

然後點擊configure,選擇"Visual Studio 10"。然後確定。

等待configure完成,會出現很多紅色的選項,因爲主要是生成OpenCV的庫,所以只需保留某些選項:

去掉BUILD_NEW_PYTHON_SUPPORT,BUILD_SHARED_LIBS,BUILD_TESTS

勾選OPENCV_BUILD_3RDPARTY_LIBS, WITH_TBB,WITH_JASPER,  WITH_JPEG,  WITH_PNG, WITH_TIFF選項,

然後再點擊configure,提示TBB_INCLUDE_DIR找不到,因爲我們不需要TBB庫,所以忽略,再一次點擊configure。

等待配置完成,最後點擊generate,完成後關閉CMake。

 

具體cmake圖文操作,網上有很多介紹,沒有太大的爭議,可採用。

3.VC++2010編譯靜態庫

在D:\OpenCV-2.1.0\OpenCV-Cmake中打開.sln文件,打開項目管理器

按住ctrl鍵,選中除過ALL_BUILD, INSTALL, ZERO_CHECK, uninstall四個項目的其他所有項目,在菜單中選擇項目->屬性,打開配置屬性->c/c++->代碼生成選項,在右側窗口中的運行時庫中選擇多線程調試(/MTd),然後確認。

注:這裏有四個選項(/MT, /MTd, /MD, /MDd),前兩個一組,爲靜態鏈接運行時庫,運行時不需要運行時庫的支持,代碼直接插入到程序中去;後兩個一組,爲動態鏈接運行時庫,運行時需要msvcr90.dll或msvcp90.dll支持。(我的理解就是VC的運行環境——靜態庫)

 

Relsea MT debug MTd

 

先編譯Debug版的OpenCV靜態庫,在解決方案"opencv"(22個項目)上單擊右鍵,選擇重新生成解決方案,此時便開始編譯OpenCV庫了,等編譯結束會提示完成16個,失敗4個:

 

這四個項目生成的是exe程序,不需要管他們。到這步我們已經生成了Debug版本的靜態庫!

然後我們用相同的方式生成Release版的庫,在之前的基礎上只需要將選項選擇多線程/MT,再進行編譯。編譯時警告很多,直接忽略!

最終需要的靜態庫就存在於:D:\OpenCV2.1.0\OpenCV-Cmake\lib 和  D:\OpenCV2.1.0\OpenCV-Cmake\3rdparty\lib  兩個目錄。分別

將 D:\OpenCV2.1.0\OpenCV-Cmake\3rdparty\lib 中Debug  下面的所有文件Copy到D:\OpenCV2.1.0\OpenCV-Cmake\lib 中的Debug   文件中。

將 D:\OpenCV2.1.0\OpenCV-Cmake\3rdparty\lib 中Release下面的所有文件Copy到D:\OpenCV2.1.0\OpenCV-Cmake\lib 中的Release文件中。

 

 

至此,靜態庫編譯完成了,不再依賴OpenCV庫。

 

 

要鏈接的庫:cv210d.lib cxcore210d.lib highgui210d.lib zlibd.lib flannd.liblibjasperd.lib libjpegd.lib libpngd.lib libtiffd.lib opencv_lapackd.libvfw32.lib videoinput.lib。  (我的理解是opencv的靜態庫)

 

遇到問題解決:不使用預編譯頭文件

 

還有一個問題就是悲催的發現OpenCV自帶的靜態lib文件和動態lib文件命名是相同的,這可如何在附加依賴項中選擇填寫啊,還是用我自己寫的後綴名不同的庫做測試吧(後來發現只有在配置的vc++目錄裏的庫文件目錄中添加staticlib路徑,然後把該路徑的順序調整到lib路徑前,就可以優先調用staticlib了)。我在我原來的程序裏測試了一下,還是不能編譯通過,很讓我惱火,求助了高人發現是附加依賴庫並沒有添加完全,找到對應的3rdparty\lib文件夾下面的zlibd.liblibjasperd.liblibjpegd.liblibpngd.liblibtiffd.lib。把這幾個文件copy到安裝目錄下,並在vs2008中配置好,這次有些可以編譯通過了,但涉及到video的highgui.lib還是不能通過。查了一下,是沒有調用系統庫文件vfw32.libvideoInput.lib(這個lib可以在cmake時選擇是否使用),新的gui還調用了滑桿控件,還需要添加comctl32.lib這個lib,把這兩個庫鏈接時添上即可。總結一下,就是需要多添加comctl32.lib vfw32.lib zlibd.lib libjasperd.lib libjpegd.liblibpngd.lib libtiffd.lib opencv_core231d.lib opencv_objdetect231d.libopencv_highgui231d.lib opencv_imgproc231d.lib,對應的release版本就把帶d後綴的去掉即可。

 

綜上所述:在VC++目錄下——庫目錄下添加剛編譯好的庫目錄D:\vc2008\OpenCV-2.1.0\vc 2010\lib\Release或\Debug

release鏈接器下面的輸入

vfw32.lib

comctl32.lib

cv210.lib

cxcore210.lib

highgui210.lib

zlib.lib

flann.lib

libjasper.lib

libjpeg.lib

libpng.lib

libtiff.lib

opencv_lapack.lib

videoinput.lib

debug鏈接器下面的輸入

vfw32.lib

comctl32.lib

cv210d.lib

cxcore210d.lib

highgui210d.lib

zlibd.lib

flannd.lib

libjasperd.lib

libjpegd.lib

libpngd.lib

libtiffd.lib

opencv_lapackd.lib

videoinput.lib

 

注意videoinput.lib這個庫文件是從源文件裏面拷貝過來

並且在最開頭加上#pragma comment(linker, "/NODEFAULTLIB:atlthunk.lib")


4.opencv 2.4.4靜態編譯

這個是現在我用的版本,個人感覺較之前靜態編譯更加方便,其靜態庫已經編譯好,F:\Opencv\build\x86\vc10\staticlib  這是我的靜態庫路徑,添加進去即可,調試改成 /MTD (debug)  
編譯運行回出現錯誤,加上下面兩行試試:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章