http://blog.163.com/dingmz_frcmyblog/blog/static/21730402320132123358913/
动态库使用
(简单)
1、在VC2010加入OpenCV所有
头文件路径即可(包括
opencv和
opencv2两个文件夹下面的所有文件,一般是
将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 2:fatal 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")
即可解决(也可在工程中设置).
#pragma comment(linker, "/NODEFAULTLIB:atlthunk.lib")
即可解决(也可在工程中设置).