半年前總結的心得,雖然現在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.lib、libjasperd.lib、libjpegd.lib、libpngd.lib、libtiffd.lib。把這幾個文件copy到安裝目錄下,並在vs2008中配置好,這次有些可以編譯通過了,但涉及到video的highgui.lib還是不能通過。查了一下,是沒有調用系統庫文件vfw32.lib和videoInput.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靜態編譯
#pragma comment( lib, "vfw32.lib" )
#pragma comment( lib, "comctl32.lib" )