QT中引入OpenCV库总结(qmake方式和cmake方式)

轻功秘籍

文章目录 前言opencv环境配置一、opencv库获取的两种方式二、qmake和cmake配置2.1、 qmake2.2、cmake2.2.1、引入opencv示例 三、qt与opencv对应关系四、问题 ……

文章目录

前言opencv环境配置一、opencv库获取的两种方式二、qmake和cmake配置2.1、 qmake2.2、cmake2.2.1、引入opencv示例

三、qt与opencv对应关系四、问题

前言

我的软件环境,写在前面

Windows10QT5.12.12VS2017OpenCV4.5.4

opencv环境配置

一、opencv库获取的两种方式

直接下载编译好的库 最简单版本无需自己编译,但是要注意opencv和VS的版本对应关系

参考:Windows上Qt配置OpenCV(最简单版本无需自己编译-避坑必看)

源码编译

参考:Windows下Visual Studio 编译OpenCV详细教程(win10+vs2017+opencv4.5.2)(OpenCV最新版)(特别适合无法科学上网的童鞋们)

二、qmake和cmake配置

2.1、 qmake

引入外部库 两种方式:参考:详解Qt添加外部库

2.2、cmake

2.2.1、引入opencv示例

cmake_minimum_required(VERSION 3.5)

project(commandset_cmake LANGUAGES CXX)

# 检查是否使用 MSVC 编译器

if(MSVC)

# 添加 /utf-8 编译选项

add_compile_options(/utf-8)

endif()

# 设置C++标准

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)

set(CMAKE_AUTOMOC ON)

set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)

set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 查找Qt5包

find_package(Qt5 COMPONENTS Core Gui WebEngineWidgets WebSockets Sql MultimediaWidgets Widgets REQUIRED)

# 包含子项目

add_subdirectory(model)

add_subdirectory(view)

add_subdirectory(utilities)

set(OpenCV_DIR "D:/OpenCV/OpenCV4.5.4/opencv/build")

find_package(OpenCV REQUIRED)

# 包含 OpenCV 头文件目录

include_directories(

${OpenCV_INCLUDE_DIRS}

${OpenCV_DIR}/include

)

# 设置可执行文件的输出目录

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/build)

# 添加可执行文件

add_executable(${PROJECT_NAME} ${ALL_SOURCES}

mainwindow.h

mainwindow.cpp

main.cpp)

# 链接Qt5模块

target_link_libraries(commandset_cmake PRIVATE

Qt5::Core

Qt5::Gui

Qt5::WebEngineWidgets

Qt5::WebSockets

Qt5::Sql

Qt5::MultimediaWidgets

${OpenCV_LIBS} # 关联OpenCV库

)

# 添加资源文件

set(RESOURCES res.qrc)

qt5_add_resources(QRC_SOURCES ${RESOURCES})

# 将资源文件添加到可执行文件

target_sources(${PROJECT_NAME} PRIVATE ${QRC_SOURCES})

三、qt与opencv对应关系

VC版本号VS对应版本vc6VC6.0vc7VS2002vc7.1VS2003vc8VS2005vc9VS2008vc10VS2010vc11VS2012vc12VS2013vc13VS2014vc14VS2015vc15VS2017vc16VS2019

四、问题

LNK2019 无法解析的外部符号 "void __cdecl cv::error(int,class std::basic_string,class std::allocator > const &,char const *,char const *,int)" (?error@cv@@YAXHAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PEBD1H@Z),函数 "public: class cv::Size_ __cdecl cv::MatSize::operator()(void)const " (??RMatSize@cv@@QEBA?AV?$Size_@H@1@XZ) 中引用了该符号 5.1 F:\Cuda Projects\5.1\5.1\kernel.cu.obj 1

LNK2019 无法解析的外部符号 "class cv::debug_build_guard::_InputOutputArray const & __cdecl cv::noArray(void)" (?noArray@cv@@YAAEBV_InputOutputArray@debug_build_guard@1@XZ),函数 main 中引用了该符号 5.1 F:\Cuda Projects\5.1\5.1\kernel.cu.obj 1

LNK2019 无法解析的外部符号 "public: __cdecl cv::Mat::Mat(void)" (??0Mat@cv@@QEAA@XZ),函数 "public: __cdecl cv::MatExpr::operator class cv::Mat(void)const " (??BMatExpr@cv@@QEBA?AVMat@1@XZ) 中引用了该符号 5.1 F:\Cuda Projects\5.1\5.1\kernel.cu.obj 1

LNK2019 无法解析的外部符号 "public: __cdecl cv::Mat::~Mat(void)" (??1Mat@cv@@QEAA@XZ),函数 main 中引用了该符号 5.1 F:\Cuda Projects\5.1\5.1\kernel.cu.obj 1

......

如果你的qt程序opencv库配置都没问题,报这个错的原因就是库版本的问题,查看opencv库中build下的x64文件夹下是vc14、vc15还是vc16,这很重要

参考:LNK2019 无法解析的外部符号 “void __cdecl cv::error(int,class std::basic_string<char,struct std::…