VS2015 + OpenCV3.4.2源码编译错误记录(Video模块编译失败)

@TOCVS2015 + OpenCV3.4.2源码编译错误记录(Video模块编译失败)

VS2015 + OpenCV3.4.2源码编译错误记录(Video模块编译失败)

这篇博客的目的是为了记录OpenCV3源码编译中的错误。

编译环境

  • 源码
    • OpenCV3.4.2
    • OpenCV_Contrib3.4.2
  • 编译工具
    • CMake3.11
    • VS2015

错误日志

46>E:\Develop\OpenCV\OpenCV342\sources342\opencv-3.4.2\modules\videoio\src\cap_msmf.cpp(800): error C2065: “ID3D11Multithread”: 未声明的标识符
46>E:\Develop\OpenCV\OpenCV342\sources342\opencv-3.4.2\modules\videoio\src\cap_msmf.cpp(800): error C2923: “`anonymous-namespace'::ComPtr”: 对于参数“T”,“ID3D11Multithread”不是有效的 模板 类型变量
46>E:\Develop\OpenCV\OpenCV342\sources342\opencv-3.4.2\modules\videoio\src\cap_msmf.cpp(800): error C2133: “D3DDevMT”: 未知的大小
46>E:\Develop\OpenCV\OpenCV342\sources342\opencv-3.4.2\modules\videoio\src\cap_msmf.cpp(800): error C2512: “`anonymous-namespace'::ComPtr”: 没有合适的默认构造函数可用
46>  E:\Develop\OpenCV\OpenCV342\sources342\opencv-3.4.2\modules\videoio\src\cap_msmf.cpp(123): note: 参见“`anonymous-namespace'::ComPtr”的声明
46>E:\Develop\OpenCV\OpenCV342\sources342\opencv-3.4.2\modules\videoio\src\cap_msmf.cpp(802): error C2100: 非法的间接寻址
46>E:\Develop\OpenCV\OpenCV342\sources342\opencv-3.4.2\modules\videoio\src\cap_msmf.cpp(802): error C2672: “IID_PPV_ARGS_Helper”: 未找到匹配的重载函数
46>E:\Develop\OpenCV\OpenCV342\sources342\opencv-3.4.2\modules\videoio\src\cap_msmf.cpp(802): error C2784: “void **IID_PPV_ARGS_Helper(T **)”: 未能从“`anonymous-namespace'::ComPtr *”为“T **”推导 模板 参数
46>  C:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\um\combaseapi.h(231): note: 参见“IID_PPV_ARGS_Helper”的声明
46>E:\Develop\OpenCV\OpenCV342\sources342\opencv-3.4.2\modules\videoio\src\cap_msmf.cpp(802): error C2660: “IUnknown::QueryInterface”: 函数不接受 1 个参数
46>E:\Develop\OpenCV\OpenCV342\sources342\opencv-3.4.2\modules\videoio\src\cap_msmf.cpp(804): error C2678: 二进制“->”: 没有找到接受“`anonymous-namespace'::ComPtr”类型的左操作数的运算符(或没有可接受的转换)
46>  E:\Develop\OpenCV\OpenCV342\sources342\opencv-3.4.2\modules\videoio\src\cap_msmf.cpp(145): note: 可能是“T *`anonymous-namespace'::ComPtr::operator ->(void) const”
46>  E:\Develop\OpenCV\OpenCV342\sources342\opencv-3.4.2\modules\videoio\src\cap_msmf.cpp(804): note: 尝试匹配参数列表“(`anonymous-namespace'::ComPtr)”时
46>E:\Develop\OpenCV\OpenCV342\sources342\opencv-3.4.2\modules\videoio\src\cap_msmf.cpp(804): error C2039: “SetMultithreadProtected”: 不是“`anonymous-namespace'::ComPtr”的成员
46>  E:\Develop\OpenCV\OpenCV342\sources342\opencv-3.4.2\modules\videoio\src\cap_msmf.cpp(123): note: 参见“`anonymous-namespace'::ComPtr”的声明
46>E:\Develop\OpenCV\OpenCV342\sources342\opencv-3.4.2\modules\videoio\src\cap_msmf.cpp(805): error C2662: “void `anonymous-namespace'::ComPtr::Release(void)”: 不能将“this”指针从“`anonymous-namespace'::ComPtr”转换为“`anonymous-namespace'::ComPtr &”
46>  E:\Develop\OpenCV\OpenCV342\sources342\opencv-3.4.2\modules\videoio\src\cap_msmf.cpp(805): note: 原因如下: 无法从“`anonymous-namespace'::ComPtr”转换为“`anonymous-namespace'::ComPtr”
46>  E:\Develop\OpenCV\OpenCV342\sources342\opencv-3.4.2\modules\videoio\src\cap_msmf.cpp(805): note: 转换要求第二个用户定义的转换运算符或构造函数

错误分析

  • videoio模块编译出错
  • Windows SDK版本是10.0.10586,错误可能与这个有关

解决方案尝试

  • 更换OpenCV版本
  • 更换CMake版本
  • 更换Windows SDK版本

问题解决

经过尝试,问题出在Windows SDK和版本上,更换为10.0.10240后,编译成功。

问题遗留

目前仍然不确定具体是什么原因,需要进一步学习,后再分析。

你可能感兴趣的:(OpenCV)