在VS C ++项目中包含静态库

时间:2017-08-09 14:42:42

标签: c++ opencv cmake visual-studio-2017 static-libraries

我有

的配置
  • Windows 10 64位
  • 使用Visual C ++ 2017的Visual Studio社区2017
  • CMake 3.9.0
  • opencv 3.3.0

目标

目标是将opencv构建为静态库( .lib )并包含到作为DLL的Visual C ++项目中。应该为x86架构编译所有内容,或者只编译为32位。

过程

最新的opencv分发版不包含为32位系统编译的dll,因此,我需要编译自己的版本。根据{{​​3}}上的opencv 2.4文档。我编译了库,BUILD_SHARED_LIBS选项被禁用并配置了目标项目,如"installation in Windows"中所述。

我的项目编译失败,出现以下错误(完全错误计数大于800)

错误类型1

LNK2038 mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' 
doesn't match value 'MDd_DynamicDebug' in main.obj  
\opencv_core320d.lib(alloc.obj)

错误类型2

LNK2005 "public: void __thiscall std::basic_ostream<char,struct 
std::char_traits<char> >::_Osfx(void)" (?_Osfx@?$basic_ostream@DU?
$char_traits@D@std@@@std@@QAEXXZ) already defined in 
opencv_core320d.lib(system.obj) \msvcprtd.lib(MSVCP140D.dll)

错误类型3

LNK2001 unresolved external symbol _ippicviHSVToRGB_16u_C3R@24  
\opencv_imgproc320d.lib(color.obj)

我认为这可能是由于编译选项不协调或我的项目配置错误,但由于我是Linux用户,我在Windows上设置这些东西时遇到了困难。

更新

在下面的屏幕中显示匹配的配置后,关于代码生成不匹配的错误块消失了,但未定义的引用仍然存在。 "how to build applications with OpenCV inside the Microsoft Visual Studio"

谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

要解决“错误类型3”,请将“.lib”文件从“staticlib”dir添加到“Linker-&gt; Input-&gt; Additional Dependencies”。例如,“_ ipp”符号在“ipp_iw.lib”和“ippicvmt.lib”中定义。

仅供参考。我使用MSVS 2012和cmake 3.9.0成功地从源代码构建了opencv作为静态和共享库(如opencv_world3 **。lib)。但是,MSVS 2017社区也做到了这一点。

PS。也许是TYPO,但是你说你使用opencv 3.3.0 ,但在错误消息中有opencv_core 320 d.lib

PPS。 “错误类型1”是在opencv_core(MTd)中使用静态调试运行时版本和在应用程序中使用动态调试运行时(MDd)的结果

答案 1 :(得分:0)

我总是遇到同样的问题。这就是我准备好使用属性表的原因。

静态编译的步骤如下:

  1. 请记住在CMake生成的解决方案中构建INSTALL项目。让我们调用$(OPENCV_DIR)安装发生的文件夹(通常类似于xxx\install)。您可以为此创建环境变量。
  2. [Configuration Properties]->[VC++ Directories]->[Include Directories] $(OPENCV_DIR)\include;前添加。分号用于分隔路径。
  3. [Configuration Properties]->[VC++ Directories]->[Library Directories] $(OPENCV_DIR)\x86\vc15\staticlib;前添加。
  4. 在OpenCV和项目之间匹配运行时库链接模式。如果您在默认情况下取消选择BUILD_SHARED_LIBS,则CRT是静态链接的(/ MT用于Release或/ MTd用于调试)。如果您希望动态链接,请取消选择BUILD_WITH_STATIC_CRT。因此,正如您已经意识到的那样,请在[Configuration Properties]->[C/C++]->[Code Generation]->[Runtime Library]
  5. 中修复它
  6. 复制与*.lib匹配的所有文件名(*d.lib用于调试),并将其添加到以{分号分隔的[Configuration Properties]->[Linker]->[Input]->[Additional Dependencies]中。
  7. 这非常痛苦,所以在属性表中执行一次,并在需要时将其包含在内。