【问题标题】:Include static library in VS C++ project在 VS C++ 项目中包含静态库
【发布时间】:2018-01-17 12:44:33
【问题描述】:

我的配置

  • Windows 10 64 位
  • Visual Studio 社区 2017 与 Visual C++ 2017
  • CMake 3.9.0
  • opencv 3.3.0

目标

目标是将 opencv 构建为静态库 (.lib) 并包含到作为 DLL 的 Visual C++ 项目中。一切都应该为 x86 架构或简单的 32 位编译。

流程

最新的 opencv 发行版不包含为 32 位系统编译的 dll,因此,我需要编译自己的版本。根据"installation in Windows" 上的opencv 2.4 文档。我已经编译了库,禁用了BUILD_SHARED_LIBS 选项并配置了目标项目,如"how to build applications with OpenCV inside the Microsoft Visual Studio" 中所述。

我的项目编译失败并出现以下错误(错误总数大于 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 上设置这些东西时遇到了困难。

更新

在我匹配屏幕下方显示的配置后,关于代码生成不匹配的错误块消失了,但未定义的引用仍然存在。

感谢您的帮助!

【问题讨论】:

  • 这几乎可以肯定是由于您的编译器或链接器设置。在库项目和 DLL 项目之间进行比较。
  • 我们可以为您的项目获取 CMakeLists.txt,该项目试图链接到 opencv 库吗?我猜这里有问题......
  • @g19fanatic 我的项目不是用 CMake 构建的,只有 opencv。我的 DLL 只是 Visual Studio 中的一个 win32 应用程序项目,所以我相信它是按照一些 Visual Studio 规则构建的。

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


【解决方案1】:

要解决“错误类型 3”,将 *.lib 文件从“staticlib”目录添加到“Linker->Input->Additional Dependencies”。例如“_ipp”符号在“ipp_iw.lib”和“ippicvmt.lib”中定义。

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

PS。也许是一个 TYPO,但你说你使用 opencv 3.3.0 但在错误消息中有 opencv_core320d.lib

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

【讨论】:

  • 如果预建的 opencv 包版本 3.3 不包含 x86 的 staticlib,opencv 2.3.14 包含,但如果我切换到旧版本,我会遇到更多问题。
  • 所以不要使用预建的 opencv 包 :)
  • 使用自己构建的库,我无法将它们正确添加为静态库,并且我无法将无数的 dll 与我正在开发的库一起携带。
  • 如果您在链接到预建库时遇到问题,在修复链接到您自己构建的库之前,您永远不会走得更远。
  • 确切地说,我目前坚持链接 pf 预建或编译的库,这个问题专门针对这个问题。
【解决方案2】:

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

静态编译的步骤如下:

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

这很痛苦,所以在属性表中执行一次,并在需要时包含它。

【讨论】:

  • 我可能仍然缺少一些东西。但是,在重新编译和重新检查项目属性后,问题数量减少了,目前我只收到unresolved external symbols
  • @hrust 如果您的问题仅与未解析的外部符号有关,通常您的 [Additional Dependencies] 中缺少一些 .lib 文件。您是否尝试在 OpenCV 构建期间取消选择 BUILD_WITH_DYNAMIC_IPP
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多