目标是将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"
谢谢你的帮助!
答案 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)
我总是遇到同样的问题。这就是我准备好使用属性表的原因。
静态编译的步骤如下:
$(OPENCV_DIR)
安装发生的文件夹(通常类似于xxx\install
)。您可以为此创建环境变量。[Configuration Properties]->[VC++ Directories]->[Include Directories]
$(OPENCV_DIR)\include;
前添加。分号用于分隔路径。[Configuration Properties]->[VC++ Directories]->[Library Directories]
$(OPENCV_DIR)\x86\vc15\staticlib;
前添加。 BUILD_SHARED_LIBS
,则CRT是静态链接的(/ MT用于Release或/ MTd用于调试)。如果您希望动态链接,请取消选择BUILD_WITH_STATIC_CRT
。因此,正如您已经意识到的那样,请在[Configuration Properties]->[C/C++]->[Code Generation]->[Runtime Library]
。*.lib
匹配的所有文件名(*d.lib
用于调试),并将其添加到以{分号分隔的[Configuration Properties]->[Linker]->[Input]->[Additional Dependencies]
中。这非常痛苦,所以在属性表中执行一次,并在需要时将其包含在内。