Opencv4.5.1 源码编译出错 无法解析的外部符号 “public: virtual struct QMetaObject const * __cdecl cvv::gui:: ……

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.相关程序与库的准备

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_worldBUILD_opencv_cvv不能同时勾选!!!

所以解决办法来了。

解决办法


  • 取消勾选 BUILD_opencv_world
  • 取消勾选 BUILD_opencv_cvv
  • 二者选其一

写在最后

因为种种原因,我已经配置过很多个opencv,但不阅读源码之前,仍然无法知晓遇到的错误从何而来,还是一个新手。CV之旅,道阻且长。如有错误的地方,欢迎指正。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值