美文网首页
18.Qt与第三方库的混合编译三种方式

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

作者: 杨强AT南京 | 来源:发表于2020-01-31 23:15 被阅读0次

      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编译截图

    相关文章

      网友评论

          本文标题:18.Qt与第三方库的混合编译三种方式

          本文链接:https://www.haomeiwen.com/subject/kownthtx.html