VS2019 配置OpenCV 4.5.1编译拓展模块opencv_contib时报错
错误描述
13> 正在创建库 D:/opencv/build/lib/Debug/opencv_world451d.lib 和对象 D:/opencv/build/lib/Debug/opencv_world451d.exp
13>view_controller.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl cvv::gui::CallTab::metaObject(void)const " (?metaObject@CallTab@gui@cvv@@UEBAPEBUQMetaObject@@XZ)
13>image_call_tab.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl cvv::gui::CallTab::metaObject(void)const " (?metaObject@CallTab@gui@cvv@@UEBAPEBUQMetaObject@@XZ)
13>view_controller.obj : error LNK2001: 无法解析的外部符号 “public: virtual void * __cdecl cvv::gui::CallTab::qt_metacast(char const *)” (?qt_metacast@CallTab@gui@cvv@@UEAAPEAXPEBD@Z)
目录
编译过程
1.相关程序与库的准备
- VS2019配置环境变量,方便找到编译器。
- 在官网下载OpenCV 4.5.1源码并解压 https://github.com/opencv/opencv/archive/refs/tags/4.5.1.zip
- 下载opcnv_contrib 4.5.1 拓展模块并安装 https://github.com/opencv/opencv_contrib/archive/refs/tags/4.5.1.zip
- 下载安装Qt 5.12.10 https://download.qt.io/official_releases/qt/5.12/5.12.10/qt-opensource-windows-x86-5.12.10.exe
- 下载安装CMake, 并配置环境变量 https://github.com/Kitware/CMake/releases/download/v3.22.0-rc2/cmake-3.22.0-rc2-windows-x86_64.msi
2.编译
(1).选择路径
- 选择源代码Source的路径
- 选择编译的路径,一般是新建一个build文件夹避免污染源码
- Configure
(2).配置生成器
- 这里我用到VS2019, 所以选择Visual Studio 16 2019。如果需要用到其他MakeFiles则需要仔细设置,检查存在性和环境变量。
- 根据需要选择生成平台,默认选 x64。
- 因为已经设置好了VS的环境变量,所以这里的编译器可以选择默认。如果环境变量有设置其他编译器的路径,则可能需要点击第二项在本地路径中找到适配目前这个设定(VS2019 x64)的编译器。
- 这个界面的设定非常重要,直接影响编译是否顺利进行,一定要保证互相适配。
(3).CMake编译选项
基本原则:不知道的不要去勾选或者取消勾选。 这样子避免了最多麻烦,容易找到导致错误的地方,然后再回头重新配置,裁剪大小。
所以这里我的设置为:
- OPENCV_EXTRA_MODULES_PATH
<opencv_contib的路径>/modules。
即拓展模块下的modules子路径。 - WITH_OPENGL
√
- WITH_QT
√
- 点击
Configue
初步生成
- 选择Qt库的路径,要和前面的编译配置对应。我这里是msvc2017_64。
- 检查红色部分没有错误后,继续
Configure
。
Generate
生成MakeFiles文件,然后Open Project
在VS2019中打开项目。
(4).Make 编译生成和Install 安装
- 打开项目后,找到CMakeTargets,选择Debug或者Release,右键ALL_BUILD,生成。
- 生成成功,没有报错。右键INSTALL,生成。
- 成功生成并没有报错。
- 选择Release/Debug重复前面的步骤。
(5).配置环境变量
到此,搭配Qt 和 opencv_contrib 模块的OpenCV已经安装完成了。下面是我本次编译遇到最大的难题。
错误原因
正在创建库 D:/opencv/build_modules_qt/lib/Debug/opencv_world451d.lib
和对象 D:/opencv/build_modules_qt/lib/Debug/opencv_world451d.exp
13>view_controller.obj : error LNK2001: 无法解析的外部符号
"public: virtual struct QMetaObject const * __cdecl
cvv::gui::CallTab::metaObject(void)const "
回到问题本身,这个错误是在创建opencv_world451d.lib时出现的。因为想要图省事,opencv_world可以把其他模块封装到一起,所以我在编译时勾选了BUILD_opencv_world
。看了很多相关的文章,没有直接说明问题的,一般是Qt编程相关的一些问题。我第一时间想到的是没有生成moc的问题。但后来总结看来,最根本的问题是cvv模块。这些无法解析的外部符号统统来自cvv::
。
一句话说完: !!!BUILD_opencv_world
和 BUILD_opencv_cvv
不能同时勾选!!!
所以解决办法来了。
解决办法
- 取消勾选
BUILD_opencv_world
- 取消勾选
BUILD_opencv_cvv
- 二者选其一
写在最后
因为种种原因,我已经配置过很多个opencv,但不阅读源码之前,仍然无法知晓遇到的错误从何而来,还是一个新手。CV之旅,道阻且长。如有错误的地方,欢迎指正。