OpenCV - VC2010中使用OpenCV靜態庫和動態庫(區別)

http://blog.163.com/dingmz_frcmyblog/blog/static/21730402320132123358913/



動態庫使用(簡單)
1、在VC2010加入OpenCV所有頭文件路徑即可(包括opencvopencv2兩個文件夾下面的所有文件,一般是將opencv2整個文件夾copy到opencv文件夾下)(解決方案->C/C++->常規->附加包含目錄)
2、在VC2010加入OpenCV所需文件路徑(解決方案屬性->連接器->常規->附加庫目錄)
3、VC2010加入OpenCV所需文件名稱(解決方案屬性->連接器->輸入->附加依賴項)

靜態庫使用
通過“OpenCV - 編譯靜態OpenCV庫(靜態庫)”一文中介紹的方法就應該能夠得到了Debug和Release版本的
OpenCV靜態庫了。
在VC2010使用這些靜態庫也是很有講究的
首先要注意幾點:
1、在VC2010加入OpenCV所有頭文件路徑即可(包括opencvopencv2兩個文件夾下面的所有文件,一般是將opencv2整個文件夾copy到opencv文件夾下)(解決方案->C/C++->常規->附加包含目錄)
2、在解決方案屬性->連接器->輸入->附加依賴項“中加入“3rdparty文件夾中的所有靜態庫(這也是和動態庫的區別之一,動態庫不需要加入這些“輔助”庫)
vfw32.lib(“3rdparty文件夾中沒有,這時系統自帶的,直接加入即可)
comctl32.lib (“3rdparty文件夾中沒有,這時系統自帶的,直接加入即可) 
libjasper.lib
libjpeg.lib
libpng.lib
libtiff.lib
zlib.lib
videoInput.lib(3rdparty文件夾中沒有,且系統也沒有,此文件在OpenCV爲編譯的源碼包中有,ctrl+F去搜索)
atlthunk.lib(可能整個電腦中都沒有此文件百度上下載,其實也有其他方法來解決"打不開此文件的錯誤",看下面的錯誤糾正)
opencv_lapack.lib
-------------------------------------------------------
注意:以上這些庫很重要,不然即使加了下面3中的OpenCV常用靜態庫也是沒用的,會有很多錯誤!
3、在解決方案屬性->連接器->輸入->附加依賴項“中加入常用的cv210d.lib cxcore210d.lib highgui210d.lib 
4、在解決方案屬性->連接器->常規->附加庫目錄“中加入這些庫文件(我通常將3rdparty文件夾中的庫文件copy到當前工程的cv210d.lib cxcore210d.lib highgui210d.lib文件所在同級目錄下)所在路徑
----------------------------------------------------------------------------------------------------------------
錯誤糾正 - 以下是在一個項目中出現的錯誤(不過只要按照以上幾個步驟使用靜態庫,這些錯誤不會發生)
----------------------------------------------------------------------------------------------------------------
Error 1:有時候使用靜態庫會出現一下問題:
      1>Store_SCU.obj : error LNK2005: _DllMain@12 已經在 dllmain.obj 中定義
              1>cxcore210.lib(cxsystem.obj) : error LNK2005: _DllMain@12 已經在 dllmain.obj 中定義
     【原因】重複定義_DllMain函數
             【解決】在響應文件("此例中爲Store_SCU.cpp")中查找(ctrl+F)到"DllMain"的位置。然後註釋掉
                           是最終保留一個即可。即註釋掉Store_SCU.cpp和cxcore210.cpp中的一個就行了。
              網上還看到另一種解決方法
              給項目添加一個dllmian.cpp,裏邊的內容爲
----------------------------------------------------------------------------------
      // dllmain.cpp : 定義 DLL 應用程序的入口點。
              #include "stdafx.h"
              // global data
              // The following symbol used to force inclusion of this module for _USRDLL
              #ifdef _X86_
              extern "C" { int _afxForceUSRDLL; }
              #else
              extern "C" { int __afxForceUSRDLL; }
              #endif

              BOOL APIENTRY DllMain( HMODULE hModule,
                                                        DWORD ul_reason_for_call,
                                                        LPVOID lpReserved)
              {
                      switch (ul_reason_for_call)
                      {
                            case DLL_PROCESS_ATTACH:
                            case DLL_THREAD_ATTACH:
                            case DLL_THREAD_DETACH:
                            case DLL_PROCESS_DETACH:
                            break;
                     }
                     return TRUE;
              }
----------------------------------------------------------------------------------
              這樣問題就 解決了。最重要的就是
              #ifdef _X86_
              extern "C" { int _afxForceUSRDLL; }
              #else
              extern "C" { int __afxForceUSRDLL; }
              #endif
              這段代碼起到了強制執行自定義dllmain函數的作用

Error 2fatal error lnk1104: 無法打開文件“videoinput.lib
             【解決】確認”解決方案屬性->連接器->輸入->附加依賴項“中加入了“videoinput.lib”文件,且”解決方案屬性->連接器->
                           常規->附加庫目錄“中存在此文件。

Error 3:在解決了Error 2中問題之後卻出現了這個問題:
              LINK : fatal error LNK1104: cannot open file 'atlthunk.lib'
             【解決】 方法和上面Error 2中方法一樣找到 'atlthunk.lib'(只能從網上下載,很簡單),然後放到當前項目中並在 
                            ”解決方案屬性->連接器->輸入->附加依賴項“中加入了  'atlthunk.lib' 文件
              此外還可以
              在程序源文件開始時加上
              #pragma comment(linker, "/NODEFAULTLIB:atlthunk.lib")
              即可解決(也可在工程中設置). 

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