首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在opencv中使用静态库代替动态库

在opencv中使用静态库代替动态库
EN

Stack Overflow用户
提问于 2013-05-30 15:59:52
回答 5查看 44.8K关注 0票数 21

我在visual studio 2012中有一个使用opencv动态库的项目。它很好地编译、链接和工作。

我想更改项目,使其使用静态库而不是动态库。

我将项目VC++目录中的库目录从

代码语言:javascript
复制
  C:\thirdparty\opencv\build\x86\vc11\lib

至: C:\thirdparty\opencv\build\x86\vc11\staticlib

但是当我想要构建这个项目时,我得到了很多链接器错误,例如:

代码语言:javascript
复制
 Error  110 error LNK2001: unresolved external symbol _TIFFWriteScanline    myproject\opencv_highgui245.lib(grfmt_tiff.obj) 

更重要的是,像这样的许多错误:

代码语言:javascript
复制
 Error  1   error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' in myproject.obj    myproject\opencv_core245.lib(system.obj)    

要将使用动态库的项目转换为使用静态库,我还应该做哪些更改?

编辑1个

将/md更改为/mt并在输入库列表中添加一些新库后:

代码语言:javascript
复制
opencv_calib3d245.lib
opencv_contrib245.lib
opencv_core245.lib
opencv_features2d245.lib
opencv_flann245.lib
libtiff.lib
libpng.lib
libjpeg.lib
libjasper.lib
IlmImf.lib
zlib.lib
opencv_gpu245.lib
opencv_haartraining_engine.lib
opencv_highgui245.lib
opencv_imgproc245.lib
opencv_legacy245.lib
opencv_ml245.lib
opencv_nonfree245.lib
opencv_objdetect245.lib
opencv_photo245.lib
opencv_stitching245.lib
opencv_ts245.lib
opencv_video245.lib
opencv_videostab245.lib

我得到了一些新的错误:

代码语言:javascript
复制
Error   9   error LNK2001: unresolved external symbol _AVIFileCreateStreamA@12  myproject\opencv_highgui245.lib(cap_vfw.obj)    
Error   8   error LNK2001: unresolved external symbol _AVIFileGetStream@16  myproject\opencv_highgui245.lib(cap_vfw.obj)    
Error   5   error LNK2001: unresolved external symbol _AVIFileInit@0    myproject\opencv_highgui245.lib(cap_vfw.obj)    
Error   7   error LNK2001: unresolved external symbol _AVIFileOpenA@16  myproject\opencv_highgui245.lib(cap_vfw.obj)    

显然有一些库丢失了,但是是哪一个呢?

编辑2需要向列表中添加更多的库。库的完整列表如下:

代码语言:javascript
复制
opencv_calib3d245.lib
opencv_contrib245.lib
opencv_core245.lib
opencv_features2d245.lib
opencv_flann245.lib
libtiff.lib
libpng.lib
libjpeg.lib
libjasper.lib
IlmImf.lib
zlib.lib
opencv_gpu245.lib
opencv_haartraining_engine.lib
opencv_highgui245.lib
opencv_imgproc245.lib
opencv_legacy245.lib
opencv_ml245.lib
opencv_nonfree245.lib
opencv_objdetect245.lib
opencv_photo245.lib
opencv_stitching245.lib
opencv_ts245.lib
opencv_video245.lib
opencv_videostab245.lib
Vfw32.Lib
comctl32.lib

这就解决了问题。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-02-22 06:58:17

通过将项目的运行时库更改为/MTd,我可以让静态库在VS2013中工作

然后包含这些链接器>>输入>>附加依赖项:

代码语言:javascript
复制
opencv_core248d.lib
opencv_imgproc248d.lib
opencv_highgui248d.lib
opencv_ml248d.lib
opencv_video248d.lib
opencv_features2d248d.lib
opencv_calib3d248d.lib
opencv_objdetect248d.lib
opencv_contrib248d.lib
opencv_legacy248d.lib
opencv_flann248d.lib
libpngd.lib
libtiffd.lib
zlibd.lib
IlmImfd.lib
libjasperd.lib
libjpegd.lib
comctl32.lib
gdi32.lib
vfw32.lib
票数 11
EN

Stack Overflow用户

发布于 2015-10-26 09:45:52

如果您使用CMake构建,那么它非常简单,因为它是OpenCV CMake选项之一;只需将BUILD_WITH_STATIC_CRT设置为off即可。例如:在CMake命令行上

代码语言:javascript
复制
-DBUILD_WITH_STATIC_CRT=OFF
票数 9
EN

Stack Overflow用户

发布于 2015-06-11 05:58:35

对于带有OpenCV 3.0.0的Visual Studio2012,这些问题仍然存在,并且此线程中的解决方案是相关的。下面是我让它工作的设置:

Windows的系统环境变量

在Windows的系统环境变量中设置:OPENCV_DIR = D:\OpenCV\build\x64\v11 (将D:\OpenCV\替换为您的opencv路径。此外,64位计算机使用x64,32位计算机使用x86 )。

在AdditionalLibraryDirectories中使用统计表

将其他库目录(视图>属性页>配置属性>链接器>常规>其他库目录)设置为:$(OPENCV_DIR)\staticlib;%(AdditionalLibraryDirectories)

运行时库

将Code Generation > Runtime Library更改为per uosɐſ's answerMulti-threaded Debug (/MTd),否则将出现以下错误:

代码语言:javascript
复制
Error   1   error LNK2038: mismatch detected for 'RuntimeLibrary': value
'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in Source.obj
C:\Users\...\documents\visual studio 2012\Projects\OpenCVTest2\OpenCVTest2\opencv_core300d.lib(alloc.obj)   OpenCVTest2

最后,附加依赖项列表

我的附加依赖项必须包含staticlib目录中的所有库名称。注意版本号;因为我使用的是OpenCV 3.0.0,所以文件名以*300d.lib结尾。我相信comctl32.libvfw32.lib不在统计表中,但我添加了它们以防万一(视图>属性页>配置属性>链接器>输入>附加依赖项):

代码语言:javascript
复制
opencv_calib3d300d.lib
opencv_core300d.lib
opencv_features2d300d.lib
opencv_flann300d.lib
opencv_hal300d.lib
opencv_highgui300d.lib
opencv_imgcodecs300d.lib
opencv_imgproc300d.lib
opencv_ml300d.lib
opencv_objdetect300d.lib
opencv_photo300d.lib
opencv_shape300d.lib
opencv_stitching300d.lib
opencv_superres300d.lib
opencv_ts300d.lib
opencv_video300d.lib
opencv_videostab300d.lib
libtiffd.lib
libpngd.lib
libjpegd.lib
libjasperd.lib
IlmImfd.lib
libwebpd.lib
ippicvmt.lib
zlibd.lib
comctl32.lib
vfw32.lib

x86 vs x64

我还遇到了这个问题,VS2012声称目标机器与this guy之类的模块机器类型不匹配。解决方案给出了here

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16830842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档