OpenCV - 編譯靜態OpenCV庫(靜態庫)

靜脈現象儀項目中需要用到OpenCV,剛開始使用了OpenCV的動態鏈接庫,這樣,在移動可執行程序時還必須將OpenCV動態支持庫一起搬移,很是麻煩。所以,最終選擇OpenCV靜態鏈接庫,這樣程序移植運行就方便了很多。
需要編譯成靜態庫以便於應用程序鏈接。 
網上有的教程中寫的在VC++2010下安裝OpenCV2.1時用到了TBB庫,而我在編譯鏈接自己的程序後需要用到TBB.dll。本人設計的目的就是要做一個獨立的界面程序,不需要攜帶其他第三方庫。經過一段時間的努力最終找到了編譯OpenCV2.1靜態庫的方法。

需要的工具環境及文件
-------------------------------------------------------------------------------------------------------------
1、Windows XP
2、VC++2010(VS2010)
3、爲編譯OpenCV源碼包(我下載的有:OpenCV2.1.0OpenCV2.3.0OpenCV2.4.4)
4、CMake2.8.9
--------------------------------------------------------------------------------------------------------------
以OpenCV2.1.0編譯靜態庫爲例
CMake配置
-------------------------------------------------------------------------------------------------------------
打開CMake並設置
Where is the rource code  :OpenCV源代碼所在的文件夾
Where to build the binariesCMake配置好得到的文件放在位置(我的:E:\OpenCV2.1.0-prj

然後點擊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,如下圖:
OpenCV - 編譯靜態OpenCV庫(靜態庫) - dingmz_frc - dingmz_frc的博客
提示TBB_INCLUDE_DIR找不到,因爲我們不需要TBB庫,所以忽略,再一次點擊configure
等待配置完成,最後點擊generate,完成後關閉CMake
-------------------------------------------------------------------------------------------------------------
VC++2010編譯靜態庫
-------------------------------------------------------------------------------------------------------------
進入E:\OpenCV2.1.0-prj目錄,使用VC++2010打開.sln文件,打開項目管理器
這時候會看到
解決方案中有很多小項目存在。
注:這時我們右鍵任意點擊一個子項目(如cv),選擇屬性,可以在配置屬性下的常規項目中看到,配置類型爲 靜態庫(lib)

按住ctrl鍵,選中除過ALL_BUILDINSTALLZERO_CHECKuninstall四個項目的其他所有項目,在菜單中選擇項目->屬性,打開配置屬性->c/c++->代碼生成選項,在右側窗口中的運行時庫中選擇多線程調試(/MTd),然後確認。
OpenCV - 編譯靜態OpenCV庫(靜態庫) - dingmz_frc - dingmz_frc的博客
說明:這裏有四個選項(/MT, /MTd, /MD, /MDd),前兩個一組,爲靜態鏈接運行時庫,運行時不需要運行時庫的支持,代碼直接插入到程序中去;後兩個一組,爲動態鏈接運行時庫,運行時需要msvcr90.dll或msvcp90.dll支持。

我們先編譯Debug版的OpenCV靜態庫,在解決方案"opencv"(22個項目)上單擊右鍵,選擇重新生成解決方案,此時便開始編譯OpenCV庫了,等編譯結束會提示完成16個,失敗4個:
OpenCV - 編譯靜態OpenCV庫(靜態庫) - dingmz_frc - dingmz_frc的博客
這四個項目生成的是exe程序,不需要管他們。到這步我們已經生成了Debug版本的靜態庫!

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

最終我們需要的靜態庫就存在:E:\OpenCV2.1.0-prj/lib 和 E:\OpenCV2.1.0-prj/3rdparty/lib 兩個目錄,我們編譯好的庫就在這兩個文件夾下。分別
E:\OpenCV2.1.0-prj/3rdparty/lib中Debug  下面的所有文件Copy到E:\OpenCV2.1.0-prj/lib中的Debug   文件中。
E:\OpenCV2.1.0-prj/3rdparty/lib中Release下面的所有文件Copy到E:\OpenCV2.1.0-prj/lib中的Release文件中。
-------------------------------------------------------------------------------------------------------------
至此,我們的庫編譯完成了,現在要做的就是編寫好自己的類,然後鏈接到下面這些庫,下次就可以直接和自己寫的庫進行鏈接,而不再依賴OpenCV庫了。要鏈接的庫包括:cv210d.lib cxcore210d.lib highgui210d.lib zlibd.lib flannd.lib libjasperd.lib libjpegd.lib libpngd.lib libtiffd.lib opencv_lapackd.lib vfw32.lib videoinput.lib。

至於OpenCV2.3.0與OpenCV2.4.4版本的靜態庫編譯完全可參考OpenCV2.1.0方法進行!
OpenCV2.3所需的lib(解決方案屬性->連接器->輸入->附加依賴項“中加入)
vfw32.lib
libjasper.lib
libjpeg.lib
libpng.lib
libtiff.lib
zlib.lib
opencv_core230.lib
opencv_highgui230.lib
opencv_video230.lib
opencv_ml230.lib
opencv_legacy230.lib
opencv_imgproc230.lib
要包含的Head files
D:\Program Files\OpenCV-2.3.0\include\opencv2
D:\Program Files\OpenCV-2.3.0\modules\highgui\include
D:\Program Files\OpenCV-2.3.0\modules\flann\include
...
OpenCV2.4與之大同小異!
發佈了9 篇原創文章 · 獲贊 8 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章