【问题标题】:using static libraries instead of dynamic libraries in opencv在opencv中使用静态库而不是动态库
【发布时间】:2013-05-25 17:08:22
【问题描述】:

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

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

我从

更改了项目 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

这解决了问题。

【问题讨论】:

  • 看起来 opencv_core245.lib 被编译为与 C 运行时库 (/MD) 的 DLL 版本链接,但您正在编译为与静态链接运行时库 (/MT) 链接。更改编译器选项以链接 DLL 运行时库。
  • @IAMHERE 是的,似乎有些错误消失了,但出现了一些其他错误。让我用新信息更新问题。
  • 请提供所有错误日志将提供简要信息。
  • 你错过了一些图书馆,我就是这样。
  • 这可能会帮助你support.microsoft.com/kb/139825

标签: c++ visual-studio opencv


【解决方案1】:

通过将项目的运行时库更改为 /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

【讨论】:

  • 与问题中提到的问题无关,但发布模式下可执行文件的大小是多少?是否符合预期?
【解决方案2】:

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

-DBUILD_WITH_STATIC_CRT=OFF

【讨论】:

  • 而我虽然 BUILD_SHARED_LIBS 足以关闭,但看起来关闭此选项对我有用。编译器 msvc141 并使用 openCV 3.4.3 版。
  • @GiladReich 与 Windows 上的所有库一样,共享库适用于您是否想要共享库 (dll) 或静态链接到 (lib) 的东西。但是,这与库调用的 MSVC 运行时 (CRT) 无关。
【解决方案3】:

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

Windows 的系统环境变量

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

为 AdditionalLibraryDirectories 使用 staticlib

将附加库目录(查看 > 属性页 > 配置属性 > 链接器 > 常规 > 附加库目录)设置为:$(OPENCV_DIR)\staticlib;%(AdditionalLibraryDirectories)

运行时库

根据uosɐſ's answer将代码生成>运行时库更改为Multi-threaded Debug (/MTd),否则会出现这种错误:

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 不在staticlib 中,但我添加它们以防万一(查看> 属性页> 配置属性> 链接器> 输入> 附加依赖项):

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

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

【讨论】:

  • “另外,x64 用于 64 位机器,x86 用于 32 位机器” - 我相信“x86/x64”是编译器目标,而不是操作系统。我为 x86 编译所有东西,它在 x86 和 64 位窗口上运行。我不知道它是否仍然是这种情况,但在某一时刻,x86 编译程序在 64 位 Windows 上的运行速度比 64 位程序快。
  • 感谢@ChrisBennet 的澄清
【解决方案4】:

老兄,让我告诉你……去过那里吗…… 我尝试了静态库的东西(几次..)它是邪恶的。

  1. 如果您使用的是 Visual Studio,最好降级到 VS2010。 VS2012 及更高版本不用于构建这些库。然后 至少对于版本 244 是正确的。您可能只能链接但 你会因为非常基本的功能而崩溃。所以请放过自己。
  2. 如果您使用 GCC,您可能会发现 .a 库是邪恶的 确实..它们是在 Windows 中为 LINUX 交叉编译的。尝试去 与 cygwin 链接,MinGw 不会完成这项工作。

尝试了 2 天后,我认为浪费了足够的时间,然后退回到 DLL,如果您使用 VS2010,它可以正常工作。

不要让它成为一个岔路..如果你确实设法链接,请与我们分享如何:)

【讨论】:

    【解决方案5】:

    我已经构建了一个依赖于具有静态链接的 OpenCV 2.4.9 的应用程序。

    1) 我刚刚添加了链接器附加依赖项:

    opencv_core249d.lib opencv_imgproc249d.lib opencv_highgui249d.lib opencv_ml249d.lib opencv_video249d.lib opencv_features2d249d.lib opencv_calib3d249d.lib opencv_objdetect249d.lib opencv_contrib249d.lib opencv_legacy249d.lib opencv_flann249d.lib libpngd.lib libtiffd.lib zlibd.lib IlmImfd.lib libjasperd.lib libjpegd.lib comctl32.lib gdi32.lib vfw32.lib

    2) 链接器 => 常规 => 附加库目录 => 将 $(OPENCV_DIR)\x86\vc12\lib 更改为 $(OPENCV_DIR)\x86\vc12\staticlib 其中 OPENCV_DIR 是环境变量设置为: C:\OpenCV 2.4.9\opencv\build

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

    并享受成功的构建。

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

    【讨论】:

    • 如何处理“命令行错误 D8016:'/clr:pure' 和 '/MTd' 命令行选项不兼容”?没有 clr 项目无法运行
    • clr 已关闭(我创建了没有 clr 支持的空 C++ 项目)。
    • 谢谢你,你的帖子帮助了我。
    • @RajeshJinaga 如果您觉得有帮助,请投票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2010-09-13
    相关资源
    最近更新 更多