您的位置:首页 > 运维架构

OpenCV学习笔记 OpenCV_SVN静态库的编译 .

2011-09-06 10:33 633 查看
之前按照常规方式(http://www.opencv.org.cn/index.php/VC_2008_Express%E4%B8%8B%E5%AE%89%E8%A3%85OpenCV2.0/2.1)用Cmake和VS2008编译了OpenCV_SVN,都是生成动态链接库的,最近写的程序Release版需要静态连接库,于是边查Google边探索怎样生成和使用OpenCV的静态库。

一、参考《编译opencv2.1静态库》(http://blog.csdn.net/sophisticated/archive/2011/03/09/6234943.aspx),生成静态库。

1、在Cmake中去掉BUILD_EXAMPLES,BUILD_NEW_PYTHON_SUPPORT,BUILD_SHARED_LIBS,BUILD_TESTS,勾选OPENCV_BUILD_3RDPARTY_LIBS, WITH_JASPER, WITH_JPEG, WITH_PNG, WITH_TIFF 选项 (这里没有勾选WITH_OPENNI,如果需要使用应该要用
OpenNI 的源码另外生成相应的静态库)。

2、编译完成后,将静态库.lib文件覆盖复制到原来按常规方式生成的lib文件夹中,例如 VS2008_build/3rdparty/lib 和 VS2008_build/lib 。注意所编译的静态库中不包含 3rdparty 中的 videoInput64.lib 和 videoInput.lib ,这两个文件在 SVN 源码中直接提供,不需要编译生成。

二、使用时的常见问题

1、编译工程的Release版之前,先在项目属性—Configuration Properties—C/C++—Code Generation 的 Runtime Library 设置为Multi-threaded (/MT)

2、在 项目属性—Configuration Properties—Linker—Input 的 Additional Dependencies 中,除了加入基本的 opencv_***220.lib 外,还要加入第三方lib,即libjasper.lib , libjpeg.lib , libpng.lib , libtiff.lib , zlib.lib , opencv_lapack.lib
等,这些都与 opencv 的 core , highgui 等模块有关。

3、如果出现“error LNK2001: unresolved external symbol
__imp__CreateToolbarEx@52” 的错误,则 Additional Dependencies 中需添加comctl32.lib 。(参考《fatal error LNK1120:
1 unresolved externals》http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=1309&start=0&st=0&sk=t&sd=a

4、如果出现“(cvcap_vfw.obj) : error LNK2001: unresolved external symbol_AVIFileRelease@4” 等错误,并不是opencv链接库的问题,而是opencv在调用win32下的vfw库,需要在
Additional Dependencies 中需加上vfw32.lib 这个系统库文件,才能顺利编译。(参考《Opencv中highgui静态链接库使用时error LNK2001的错误》http://hi.baidu.com/56908268/blog/item/0f619bef2ce6efe1ce1b3efb.html

5、如果出现“fatal error LNK1104: cannot open file “atlthunk.lib””的错误,是因为VS2005以上版本的ATL和MFC库中已不再带有这个文件,因此一般情况下可去掉对atlthunk.lib 的引用。参考《directshow 问题 找不到 atlthunk.lib》(http://topic.csdn.net/u/20090709/11/f3f9a286-9ef4-4e83-8808-26fb52ad5cb5.html)18、19和26楼的方法,在项目的头文件stdafx.h
中添加如下代码:

view plaincopy to clipboardprint?

// TODO: reference additional headers your program requires here
//在这添加*************************************************************
#include

#pragma comment(linker, "/NODEFAULTLIB:atlthunk.lib")

#if (_ATL_VER < 0x0700)
namespace ATL
{
inline void * __stdcall __AllocStdCallThunk()
{
return ::HeapAlloc(::GetProcessHeap(), 0, sizeof(_stdcallthunk));
}
inline void __stdcall __FreeStdCallThunk(void *p)
{
::HeapFree(::GetProcessHeap(), 0, p);
}
};
#endif //(_ATL_VER < 0x0700)
//***************************************************************添加结束

如果确实需要用到 atlthunk.lib ,可以到这里(http://download.csdn.net/source/1672909)下载WDK7.0的ATL7.1,从中抽取出
atlthunk.lib,放到 $(VCInstallDir)atlmfc/lib 里。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐