18.Qt与第三方库的混合编译三种方式

  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以便备忘。

  • 例子程序使用的库:

    1. 使用Qt的库包含:
      1. Qt5Cored.lib
      2. Qt5Widgetsd.lib
      3. Qt5Guid.lib
    2. 使用OpenCV的库包含
      1. opencv_core420d.lib
      2. opencv_imgcodecs420d.lib
      3. opencv_highgui420d.lib
      4. opencv_imgproc420d.lib
  • 因为调试的缘故,所以这里使用的库都是调试库,带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")
# 项目模板(编译的是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编译截图

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容