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所有 头文件路径 即可(包括 opencv opencv2 两个文件夹下面的所有文件,一般是 将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")
              即可解决(也可在工程中设置). 

你可能感兴趣的:(Opencv)