Qt编程的编译牵涉moc,uic,rcc,qml等资源的编译,所以提供了qmake的编译脚本组织方式,但实际上对C/C++编程可以直接调用编译工具编译。为了方便可以使用shell脚本,然后发明了Makefile脚本语法,后来又提供了跨平台的CMakeLists.txt语法,对Qt自己又提出了qmake的语法。大致按照进化历史有如下几种编译方法:
1. 命令行编译
2. shell脚本
3. Makefile脚本
4. CMake脚本
5. QMake脚本
因为使用的是微软的编译器,所以下面的脚本执行前,请先执行一个叫做vcvars64.bat的程序脚本,如果已经安装了Visual Studio2019,则您总是能找到他的。
前言
-
这里对Qt与OpenCV等第三方库混合编译提供Makefile,CMake,QMake三种编译脚本的DEMO以便备忘。
-
例子程序使用的库:
- 使用Qt的库包含:
- Qt5Cored.lib
- Qt5Widgetsd.lib
- Qt5Guid.lib
- 使用OpenCV的库包含
- opencv_core420d.lib
- opencv_imgcodecs420d.lib
- opencv_highgui420d.lib
- opencv_imgproc420d.lib
- 使用Qt的库包含:
-
因为调试的缘故,所以这里使用的库都是调试库,带d后缀。从而所有的编译都使用调试编译。
-
代码:
- 就是使用Qt作为UI,使用OpenCV作为图像处理。
#include <iostream>
#include <QtWidgets/QApplication>
#include <QtWidgets/QDialog>
#include <QtWidgets/QLabel>
#include <QtWidgets/QDesktopWidget>
#include <opencv2/opencv.hpp>
// 没有使用面向对象的封装
int main(int argc, char**argv){
// 创建Qt应用
QApplication application(argc, argv);
// 创建窗体QDialog / QMainWindow 及其他的窗体QWidget等。
QDialog dlg;
dlg.setWindowTitle("Qt与OpenCV-Makefile");
dlg.resize(800, 600);
dlg.setFixedSize(dlg.width(), dlg.height()); // 不允许改变窗体大小
dlg.move ((QApplication::desktop()->width() - dlg.width()) / 2, (QApplication::desktop()->height() - dlg.height()) / 2);
// 使用QLabel显示图像
QLabel lbl_show("显示图像区域",&dlg);
lbl_show.setAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
lbl_show.setGeometry(0, 0, dlg.width(), dlg.height());
// 图像的处理
cv::Mat img = cv::imread("../gpu.bmp");
// 把图像转换为Qt支持的对象
QImage qt_img(img.data, img.cols, img.rows, QImage::Format_RGB888);
QPixmap qt_pixmap = QPixmap::fromImage(qt_img);
lbl_show.setPixmap(qt_pixmap);
lbl_show.setScaledContents(true);
dlg.show();
// 应用消息处理
return application.exec();
}
三种编译脚本
Makefile脚本
- 直接使用nmake编译
- 可以完美解决编码问题
INCLUDES = /I "C:\Qt\Qt-5.14.0\include" \
/I "C:\opencv\install\include"
LIBS = /LIBPATH:"C:\Qt\Qt-5.14.0\lib" \
/LIBPATH:"C:\opencv\install\x64\vc16\lib" \
/DYNAMICBASE \
"opencv_core420d.lib" \
"opencv_imgcodecs420d.lib" \
"opencv_highgui420d.lib" \
"opencv_imgproc420d.lib" \
"Qt5Cored.lib" \
"Qt5Widgetsd.lib" \
"Qt5Guid.lib"
CL_ARGS = /EHsc \
/MDd \
/source-charset:utf-8 \
/execution-charset:utf-8 \
/nologo
LINK_ARGS = /DEBUG /MACHINE:X64 /NOLOGO
OUTFILE = main.exe
SOURCE = main.cpp
OBJS = main.obj
$(OUTFILE):$(SOURCE)
@cl /c $(CL_ARGS) /Fo:$(OBJS) $(INCLUDES) $(SOURCE)
@link $(LINK_ARGS) $(LIBS) /OUT:$(OUTFILE) $(OBJS)
clean:
@del *.obj *.exe *.pdb *.ilk 2>/Nul
# 记得把Qt与OpenCV的dll所在目录设置为PATH环境变量,否则运行的时候会产生错误。
CMakeLists.txt脚本
- 使用步骤:
- mkdir build && cd build
- cmake ..
- 这种方式,这里没有解决编码问题,可以使用如下命令修改:
- add_compile_options:add_compile_options(-std=c++11)
- set命令修改CMAKE_CXX_FLAGS或CMAKE_C_FLAGS。
cmake_minimum_required(VERSION 3.16)
project(main)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON) # 自动开启MOC编译(信号与槽等宏预编译)
set(CMAKE_AUTOUIC ON) # 自动开启UIC编译(ui文件从xml翻译为.cpp或者.h,.hpp文件)
# Qt的cmake
set(CMAKE_PREFIX_PATH "C:/Qt/Qt-5.14.0/lib/cmake")
# 加载Qt的预制的cmake,会产生很多内置变量
find_package(Qt5Widgets REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5Core REQUIRED)
# 头文件目录
include_directories(
C:/Qt/Qt-5.14.0/include
C:/opencv/install/include
)
# 库路径
link_directories(
C:/opencv/install/x64/vc16/lib
C:/Qt/Qt-5.14.0/lib
)
# 编译的文件(使用的是目录)
aux_source_directory(. SOURCES)
add_executable(main ${SOURCES})
# 编译需要的库
target_link_libraries(
main
opencv_core420d.lib
opencv_imgcodecs420d.lib
opencv_highgui420d.lib
opencv_imgproc420d.lib
Qt5Cored.lib
Qt5Widgetsd.lib
Qt5Guid.lib)
-
cmake执行脚本截图
cmake脚本执行截图 -
编译截图
使用Visual Studio编译截图
pro脚本
- 使用方式
- qmake
- nmake
- 注意
- pro不支持UTF8 BOM。
- 编码可以使用代码中扩展指令:
#pragma execution_character_set("utf-8")
- QMAKE_CXXFLAGS += -Ficharset.inc
- QMAKE_CFLAGS += -Ficharset.inc
- 其中:charset.inc是预处理文件
#pragma execution_character_set("utf-8")
- 其中:charset.inc是预处理文件
# 项目模板(编译的是app应用?lib库等)
TEMPLATE = app
# 基本配置
CONFIG += debug
CONFIG += window
CONFIG += qt
# QT的库
QT += core
QT += gui
QT += widgets
# 头文件
INCLUDEPATH = "C:\opencv\install\include"
# OpenCV的库
LIBS += -L"C:\opencv\install\x64\vc16\lib" -lopencv_core420d -lopencv_imgcodecs420d -lopencv_highgui420d -lopencv_imgproc420d
# 输出文件目录
DESTDIR = .\
# 源代码与头文件
SOURCES += main.cpp
# HEADERS += main.h
# 编译的执行文件
TARGET = main
-
编译截图
qmake与nmake编译截图
网友评论