opencv3.4.16编译报错记录(VS2022+gpu)

一、protobuf版本问题 

        opencv3.4.16 包括contrib 扩展的编译方式网上有很多,根据教程来基本没啥问题,我这里遇到的问题是因为VS2022 默认的C++ 语言标准为C++ 14,在我不修改语言标准的情况下,编译protobuf 模块会报错"hash_compare 不是 std 的成员"。虽然看起来报错很多,但是根本原因都是hash_map 在C++ 高版本语言标准所做的修改导致的 :

        这个问题我在编译opencv4.7.0 的时候已经没有了,应该是更新的protobuf 的版本从3.5.2 升级到3.19.2 之后,不再使用hash_map 所以就没有这个问题了。但是opencv3.4.16 不能直接升级protobuf 的版本,因为涉及到跟很多其它组件的兼容性问题,但是又不想修改C++ 的语言标准的话,可以通过下面两步修改来解决:

1. 在opencv-3.4.16/3rdparty/protobuf/src/google/protobuf/stubs/hash.h 头文件中加入<hash_map>的引用:加入这个引用之后,opencv编译的时候就会到对应的文件下去寻找hash_compare 相关的类了。但是这时会引入另一个报错,大意就是<hash_map>在后续的版本会被移除,建议你使用<unordered_map>,这里我们就不听它的了,因为它后面还有一句是可以通过宏定义来屏蔽这个报错:

2. 在<hash.h>头文件的开头,加_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 的宏定义:这样就可以屏蔽上述的报错,正常使用<hash_map>进行编译了:

二、CMake-Configure 的时候遇到的问题

1. Could not find OpenBLAS lib

        我环境里确实没安装OpenBLAS,没有检测到直接配置项置为OFF没有问题,编译出来的opencv 库就不会使用OpenBLAS相关的功能。

        如果想要使用OpenBLAS的话,需要去https://github.com/xianyi/OpenBLAS.git 下载对应的压缩包,然后进行解压,解压完成后修改opencv-3.4.16/cmake/OpenCVFindOpenBLAS.cmake 文件中的FIND_PATH 和FIND_LIBRARY 对应的目录。因为我下载的版本对应的库名称为libopenblas.lib,所以FIND_LIBRARY 中库名称也要做相应修改:

        修改完成后重新在CMake 上执行Configure 即可。

2. CMake Warning at cmake/OpenCVGenSetupVars.cmake:54 (message):CONFIGURATION IS NOT SUPPORTED 

         这个网上基本都提供了解决办法,就是在CMake 的配置项里把OPENCV_GENERATE_SETUPVARS 选项关闭就可以了:

         具体原因可以查看opencv-3.4.16/cmake/OpenCVGenSetupVars.cmake 文件,直接搜索这个报错就可以看到是由于opencv-python 的路径配置有问题导致的。一般情况下,编译opencv 库都是为了C++ 下使用,所以把python 相关的这个选项关闭掉是没啥问题的。

        我不太确定是不是因为我没有安装python2(我只安装了python3) 导致的,如果想不通过关闭选项解决这个报错的话,可以安装或者配置一下试试。

三、编译CUDA版本遇到的问题

1. 进行CMake-Configure的时候报错:CUDA: Autodetection arch list is empty

        这个是Windows下无法检测到CUDA架构的问题,需要修改CUDA_ARCH_BIN 配置项的值,可以到官网查询自己显卡对应的算力,然后填写在配置项中。

2. 编译的时候报错:Unexpected compiler version, expected CUDA 11.6 or newer

        这个是由于VS2022 对应的SDK 编译CUDA 的时候默认会校验版本,而我电脑安装的是11.3 比要求的11.6 版本要低,所以编译失败。如果不想调整VS 或者CUDA 版本的话,在opencv-3.4.16 目录下的CMakeLists.txt 文件中增加_ALLOW_COMPILER_AND_STL_VERSION_MISMATCH 的宏定义即可: