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

2020-01-31  本文已影响0人  杨强AT南京

  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,则您总是能找到他的。


前言

#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脚本

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脚本

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)

pro脚本

# 项目模板(编译的是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


上一篇下一篇

猜你喜欢

热点阅读