Opencv4.8.1 + contrib 编译失败

环境

Windows 10 x64 教育版 22H2 19045.3324

Visual Studio 2015

Windows SDK 10.0.10586.0

Windows SDK 10.0.10240.0

这两个版本的 Windows SDK 是我在安装 Visual Studio 2015 时选择的。

错误输出

error C2065: “ID3D11Multithread”: 未声明的标识符
error C2923: “anonymous-namespace'::ComPtr”: 对于参数“T”,“ID3D11Multithread”不是有效的 模板 类型变量 error C2133: “D3DDevMT”: 未知的大小 error C2512: “anonymous-namespace'::ComPtr”: 没有合适的默认构造函数可用
error53>  D:\Library\opencv-4.8.1\modules\videoio\src\cap_msmf.cpp(96): note: 参见“anonymous-namespace'::ComPtr”的声明 error C2100: 非法的间接寻址 error C2672: “IID_PPV_ARGS_Helper”: 未找到匹配的重载函数 error C2784: “void **IID_PPV_ARGS_Helper(T **)”: 未能从“anonymous-namespace'::ComPtr *”为“T **”推导 模板 参数
error53>  C:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\um\combaseapi.h(231): note: 参见“IID_PPV_ARGS_Helper”的声明
error C2660: “IUnknown::QueryInterface”: 函数不接受 1 个参数
error C2678: 二进制“->”: 没有找到接受“anonymous-namespace'::ComPtr”类型的左操作数的运算符(或没有可接受的转换) error53>  D:\\Library\\opencv-4.8.1\\modules\\videoio\\src\\cap_msmf.cpp(125): note: 可能是“T *anonymous-namespace'::ComPtr<T>::operator ->(void) const”
error53>  D:\Library\opencv-4.8.1\modules\videoio\src\cap_msmf.cpp(1009): note: 尝试匹配参数列表“(anonymous-namespace'::ComPtr)”时 error C2039: “SetMultithreadProtected”: 不是“anonymous-namespace'::ComPtr”的成员
error53>  D:\Library\opencv-4.8.1\modules\videoio\src\cap_msmf.cpp(96): note: 参见“anonymous-namespace'::ComPtr”的声明 error C2662: “void anonymous-namespace'::ComPtr<T>::Release(void)”: 不能将“this”指针从“anonymous-namespace'::ComPtr”转换为“anonymous-namespace'::ComPtr<T> &”
error53>  D:\Library\opencv-4.8.1\modules\videoio\src\cap_msmf.cpp(1010): note: 原因如下: 无法从“anonymous-namespace'::ComPtr”转换为“anonymous-namespace'::ComPtr<T>”
error53>  D:\Library\opencv-4.8.1\modules\videoio\src\cap_msmf.cpp(1010): note: 转换要求第二个用户定义的转换运算符或构造函数
error54>------ 已启动全部重新生成: 项目: opencv_highgui, 配置: Debug Win32 ------
error54>  Building Custom Rule D:/Library/opencv-4.8.1/modules/highgui/CMakeLists.txt
无法打开文件“..\..\lib\Debug\opencv_videoio481d.lib”

问题原因

当前的 Windows SDK (10586、10240)版本太旧,无法支持一些新的 api,导致编译失败,从而无法生成后续编译所需的lib文件。

解决办法

在微软官网下载最新的 Windows SDK 安装(这里下载的是 10.0.22621.0 ),安装成功后重新打开项目,在 visutal studio 中右键 opencv 解决方案,选择 “重定解决方案目标“,下拉找到新安装的 Windows SDK 即可,再次编译,全部通过。

其它

有可能还会遇到 ”UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x93 in position 1159: illegal multibyte sequence“ 错误。属于python编码问题,只需要在系统环境变量添加 PYTHONUTF8=1 即可解决,需要注意,仅支持 python3.7+版本。

参考链接:https://www.cnblogs.com/leoking01/p/13757234.html

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注