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")
              即可解决(也可在工程中设置). 

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