C++ 在opencv中使用静态库而不是动态库

C++ 在opencv中使用静态库而不是动态库,c++,visual-studio,opencv,C++,Visual Studio,Opencv,我在visual studio 2012中有一个使用opencv动态库的项目。它编译、链接并运行良好 我想更改项目,使其使用静态库而不是动态库 我将project VC++目录中的库目录从 C:\thirdparty\opencv\build\x86\vc11\lib 致: C:\thirdparty\opencv\build\x86\vc11\staticlib 但是,当我想要构建项目时,我会遇到很多链接器错误,例如: Error 110 error LNK2001: unresol

我在visual studio 2012中有一个使用opencv动态库的项目。它编译、链接并运行良好

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

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

  C:\thirdparty\opencv\build\x86\vc11\lib
致: C:\thirdparty\opencv\build\x86\vc11\staticlib

但是,当我想要构建项目时,我会遇到很多链接器错误,例如:

 Error  110 error LNK2001: unresolved external symbol _TIFFWriteScanline    myproject\opencv_highgui245.lib(grfmt_tiff.obj) 
更重要的是,有很多错误,比如:

 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并将一些新库添加到输入库列表后:

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
我发现了一些新的错误:

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 需要向列表中添加更多库。图书馆的完整列表如下:

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

这就解决了问题。

老兄,让我告诉你。。。有人做过那样的事吗。。 我尝试了静态lib(几次…)它是邪恶的

  • 如果您使用的是VisualStudio,最好降级回 VS2010。VS2012及以上版本不用于构建这些库。那 至少对于版本244是正确的。您可能只是能够链接,但是 使用非常基本的函数会导致崩溃。。所以饶了你自己吧
  • 如果您使用GCC,您可能会发现.a libs是邪恶的 的确它们是在windows for LINUX中交叉编译的。试图 和cygwin联系,MinGw不会做这件事的
  • 在尝试了两天之后,我觉得浪费的时间已经够多了,于是又回到了DLL,如果使用VS2010,它可以正常工作


    别让它让人讨厌。。如果您成功链接,请与我们分享:)

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

    然后包括这些链接器>>输入>>其他依赖项:

    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
    
    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
    

    我已经建立了一个应用程序,它依赖于OpenCV 2.4.9和静态链接

    (一) 我刚刚添加了链接器其他依赖项:

    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
    
    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
    
    opencv_core249d.lib opencv_imgproc249d.lib opencv_highgui249d.lib opencv_ml249d.lib opencv_video249d.lib opencv_特性2d249d.lib opencv_calib349d.lib opencv_objdetect249d.lib opencv_contrib249d.lib opencv_legacy249d.lib opencv_flann249d.lib libpngd.lib libtiffd.lib zlibd.lib IlmImfd.lib libjasperd.lib libjpeg.lib comctl32.lib gdi32.lib vfw32.lib

    (二) 链接器=>常规=>其他库目录=>已将$(OPENCV\U DIR)\x86\vc12\lib更改为$(OPENCV\U DIR)\x86\vc12\staticlib,其中OPENCV\U DIR是环境变量,设置为: C:\OpenCV 2.4.9\OpenCV\build

    (三) 并将C/C++=>代码生成=>多线程调试DLL(MD)更改为多线程调试(MTd)

    享受成功的建造


    同样的事情也适用于发布模式(当然是针对非调试库的链接)

    对于使用OpenCV 3.0.0的Visual Studio 2012,这些问题仍然适用,并且此线程中的解决方案是相关的。以下是我的设置以使其正常工作:

    Windows的系统环境变量
    在Windows的系统环境变量中设置:
    OPENCV\u DIR=D:\OPENCV\build\x64\v11
    (将
    D:\OPENCV\
    替换为指向OPENCV的任何路径。另外,64位机器使用x64,32位机器使用x86)

    对其他Library目录使用staticlib 将附加库目录(视图>属性页>配置属性>链接器>常规>附加库目录)设置为:
    $(OPENCV\u DIR)\staticlib;%(附加图书馆目录)

    运行库 将代码生成>运行时库更改为多线程调试(/MTd)per,否则会出现此类错误:

    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.lib
    vfw32.lib
    不在staticlib中,但我添加它们只是为了以防万一(视图>属性页>配置属性>链接器>输入>其他依赖项):

    x86对x64
    我还遇到了这个问题,VS2012声称目标机器与模块机器类型不匹配,如。给出了解决方案。

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

    -DBUILD_WITH_STATIC_CRT=OFF
    

    看起来opencv_core245.lib被编译为与C运行时库(/MD)的DLL版本链接,但您正在编译为与静态链接的运行时库(/MT)链接。更改编译器选项以链接DLL运行库。@我这里是的,似乎有些错误消失了,但有些错误出现了。让我用新信息更新问题。请提供所有错误日志将提供简要信息。您缺少一些库,我认为是这样。这可能有助于您处理“命令行错误D8016:'/clr:pure'和'/MTd'命令行选项不兼容”?项目不工作,没有CLR CLR关闭(我已经创建了空C++项目没有CLR支持)。谢谢,你的帖子帮助我。@ RajjHigaGa请投票,如果你觉得它有用。“此外,X64的64位机,x86的32位机”-我相信“x86 /x64”是编译器的目标,而不是操作系统。我为x86编译所有内容,它在x86和64位windows上运行。我不知道情况是否仍然如此,但有一次,x86编译的程序在64位Windows上运行得比64位程序快。感谢@ChrisBennetAnd的澄清,我认为
    BUILD\u SHARED\u LIBS
    已经足够关闭了,看起来关闭这个选项对我来说已经足够了。编译器msvc141并使用openCV版本3.4.3。@Giladrich与Windows上的所有库一样,共享库