一篇水文,部署没什么难度,环境变量重复包含居然会导致编译通过但无法在QtCreator运行,记录一下。

Qt的OpenCV环境部署

在此前一篇文章OpenCV C++记录(一):基于MinGW的环境搭建我们使用了mingw通过cmake编译OpenCV 4.5.5,因为勾选了With QT选项现在可以直接将OpenCV集成到Qt项目,仍然采用cmake管理。

自动关联路径

Qt的cmake可以通过find_package来自动搜索依赖包,我们只需要包含OpenCV的编译路径即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
cmake_minimum_required(VERSION 3.5)

project(QtOpenCVtest)
set(CMAKE_AUTOMOC ON)
find_package(Qt5
COMPONENTS
Core
# Gui
# Widgets
REQUIRED
)

set(OpenCV_DIR "D:/opencv-4.5.5/build/install") #设置install路径
find_package(OpenCV REQUIRED)

add_executable(${PROJECT_NAME})

target_sources(${PROJECT_NAME} PRIVATE
main.cpp
)

target_include_directories(${PROJECT_NAME} PRIVATE ${OpenCV_INCLUDE_DIRS}) #设置头文件

target_link_libraries(${PROJECT_NAME} PRIVATE #设置库文件
Qt5::Core
# Qt5::Gui
# Qt5::Widgets
${OpenCV_LIBS}
)

手动关联路径

首先要从之前的编译步骤获取OpenCV库的头文件和库文件路径,例如:

1
2
D:/opencv-4.5.5/build/install/include #头文件路径
D:/opencv-4.5.5/build/install/x64/mingw/lib #库文件路径

这种方法好处是能够灵活引入库,以下引入了5个常用的cv库,基本涵盖了大部分开发需求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
cmake_minimum_required(VERSION 3.5)

project(QtOpenCVtest)

set(CMAKE_AUTOMOC ON)

find_package(Qt5
COMPONENTS
Core
# Gui
# Widgets
REQUIRED
)

# 自动
#set(OpenCV_DIR "D:/opencv-4.5.5/build/install")
#find_package(OpenCV REQUIRED)

add_executable(${PROJECT_NAME})

target_sources(${PROJECT_NAME} PRIVATE
main.cpp
)

# 自动
#target_include_directories(${PROJECT_NAME} PRIVATE ${OpenCV_INCLUDE_DIRS})
#target_link_libraries(${PROJECT_NAME} PRIVATE
# Qt5::Core
## Qt5::Gui
## Qt5::Widgets
# ${OpenCV_LIBS}
#)

#手动管理
target_include_directories(${PROJECT_NAME} PRIVATE D:/opencv-4.5.5/build/install/include)
target_link_directories(${PROJECT_NAME} PRIVATE D:/opencv-4.5.5/build/install/x64/mingw/lib)

target_link_libraries(${PROJECT_NAME} PRIVATE
Qt5::Core
# Qt5::Gui
# Qt5::Widgets
# ${OpenCV_LIBS} #自动
opencv_calib3d455 #手动链接
opencv_core455
opencv_highgui455
opencv_imgproc455
opencv_imgcodecs455
)

测试程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "opencv2/opencv.hpp"
//#include <QApplication>
#include <QDebug>

using namespace std;
using namespace cv;

int main(int argc, char*argv[])
{
//QApplication app(argc,argv);
cv::Mat m(800,800,CV_8UC1,255);
cv::imshow("test",m);

qDebug() <<"done";
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
//return app.exec();
}

Q&A

无论哪种方法,如果能通过编译生成可执行文件就说明链接问题不大,头疼的是这里遇到了两个问题,摸索着还算是解决了:

  1. Qt运行程序显示:
    1
    Cannot retrieve debugging output.
  • 当Qt多开时会出现这个报错,必须关闭另一个Qt调试进程才能调试另一个进程!
  1. 双击程序/命令行下均可运行,但在QtCreator报错:程序异常结束; 这个提示是比较扯淡的,只提示异常结束却没有具体错误,但是思考一下,既然编译能通过并且能在Win10环境运行,说明cmake编译和代码是没问题的,问题出在QtCreator的运行环境。

    反复检查了系统环境变量,Qt和OpenCV变量的顺序和设置都是ok的,因为它们在其他工程被引用过。

    此处打开QtCreator左侧项目,选择对应的kit的Run选项,查看Qt中的PATH环境变量,发现除了系统环境变量,Qt还加上了:

    1
    2
    3
    4
    D:\Qt\5.12.12\mingw73_64\lib
    D:\Qt\5.12.12\mingw73_64\bin
    D:\opencv-4.5.5\build\install\x64\mingw\lib
    D:\opencv-4.5.5\build\install\x64\mingw\bin
    这也是本文用到的环境变量似乎没有问题,但是这些已经在系统环境变量中包含了,重复包含就出现了这个报错,找了半天原来这是罪魁祸首;

    • 界面中有一个选项"Add build library search path to PATH",取消这项勾选即可仅使用系统环境变量,运行成功。

    解决本错误过程中还发现其他原因虽然不是本文解决的方法,但也可能导致这样的报错(这些双击程序未必可运行),记录以供参考:

    • release误用了debug库或debug版本误用release库,这种情况两个版本都试试即可排除;

    • 系统环境变量设置错误/没有生效:检查与重启大法;

    • 系统库缺失/第三方库本身有缺陷问题,这个重装万不得已再试吧。