QT中引入OpenCV库总结(qmake方式和cmake方式)
文章目录
- 前言
- opencv环境配置
- 一、opencv库获取的两种方式
- 二、qmake和cmake配置
- 2.1、 qmake
- 2.2、cmake
- 2.2.1、引入opencv示例
- 三、qt与opencv对应关系
- 四、问题
前言
我的软件环境,写在前面
- Windows10
- QT5.12.12
- VS2017
- OpenCV4.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对应版本 |
---|---|
vc6 | VC6.0 |
vc7 | VS2002 |
vc7.1 | VS2003 |
vc8 | VS2005 |
vc9 | VS2008 |
vc10 | VS2010 |
vc11 | VS2012 |
vc12 | VS2013 |
vc13 | VS2014 |
vc14 | VS2015 |
vc15 | VS2017 |
vc16 | VS2019 |
四、问题
LNK2019 无法解析的外部符号 "void __cdecl cv::error(int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > 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_<int> __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::…