• 02.QMake项目原理和手动配置qtcreator


    一、qt项目由源码和界面资源文件到程序的步骤分析

    Qt程序编译经历的步骤

    • 编译pro生成makefile
    • jom或者make编译makefile
      • 生产界面源码
        uic.exe widget.ui -o ui_widget.h
      • 生产信号槽代码
        moc.exe widget.h moc_widget.cpp

    从代码到程序执行经历的步骤

    • 预处理-头文件加载和宏生成cpp
    • 编译-cpp到.o或者.obj
    • 链接so lib o obj res a
    • 执行exe dll so

    二、 配置vs和qmake环境变量执行qmake生成makefile

    手动创建pro

    1. 创建testqmake.pro
    SOURCES += main.cpp
    CONFIG += console
    
    • 1
    • 2

    创建main.cpp

    #include 
    
    using namespace std;
    
    int main()
    {
    	cout << "test for qmake" << endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 配置vc的环境

    找寻“C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build”中的vcvarsall.bat
    在这里插入图片描述

    创建bat文件配置vc环境
    make.bat

    "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"
    
    • 1

    记得带引号,不然空格会有问题

    注:vcvarsall.bat 是 Microsoft Visual C++ 编译器 (MSVC) 提供的一个批处理脚本,用于设置开发环境的一些必要变量和路径,以便编译和构建 C++ 代码。它通常用于配置命令行开发环境,以便使用 Visual C++ 编译器和工具链。

    在这里插入图片描述
    在这里插入图片描述

    1. 配置Qt环境变量

    配置qmake
    在这里插入图片描述
    配置jom(用来做编译的)

    在这里插入图片描述

    使用jom /f Makefile.Debug编译Debug版本
    在这里插入图片描述

    统一到批处理中
    make.bat文件如下:

    call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"
    qmake -o makefile testqmake.pro
    jom /f makefile.Debug
    pause
    
    • 1
    • 2
    • 3
    • 4

    四、qmake的pro项目导出为vs项目

    导入VS

    • qmake -tp vc test.pro
    • 使用vs工具导入

    五、qmake引入qt库创建窗口设置头文件分析makefile并设置输出

    加载Qt内部库

    • QT += core gui
    • QT -= gui

    头文件引用

    testqmake.pro配置

    QT += widgets
    message($$PWD)
    
    INCLUDEPATH += ../../include
    #INCLUDEPATH += $$PWD/../../include
    
    SOURCES += main.cpp
    CONFIG += console
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    main.cpp配置

    #include 
    #include 
    #include 
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QWidget w;
        w.show();
        a.exec();
    
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    六、qmake语法设置pro中的库导入路径和导入库导入opencv

    库引用和库路径指定

    • LIBS += -L"…/…/lib" -lopencv_world320
    • linux libopencv_world320.so

    testqmake.pro配置

    QT += widgets
    message($$PWD)
    
    INCLUDEPATH += include
    #INCLUDEPATH += $$PWD/../../include
    LIBS += -Llib -lopencv_world480
    
    SOURCES += main.cpp
    CONFIG += console
    DESTDIR += bin
    TARGET = testq
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    main.cpp配置

    #include 
    #include 
    #include 
    #include 
    
    using namespace cv;
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        namedWindow("opencv");
        QApplication a(argc, argv);
        QWidget w;
        w.show();
        a.exec();
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    七、qmake创建动态链接和静态链接库并在windows中输出dll和lib

    libdll.pro

    SOURCES += xsocket.cpp
    HEADERS += xsocket.h \
        xglobal.h
    TARGET= libdll
    TEMPLATE = lib
    
    DEFINES += LIBDLL_LIB
    #CONFIG = staticlib
    #CONFIG += console
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    xglobal.h

    #ifndef XGLOBAL_H
    #define XGLOBAL_H
    #include 
    
    #ifndef LIBDLL_LIB
        #define XEXPORT Q_DECL_EXPORT
    #else
        #define XEXPORT Q_DECL_IMPORT
    #endif
    
    #endif // XGLOBAL_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    xsocket.h

    #ifndef XSOCKET_H
    #define XSOCKET_H
    #include "xglobal.h"
    
    class XEXPORT test1
    {
    public:
        test1();
    };
    
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    xsocket.cpp

    #include 
    #include "xsocket.h"
    
    using namespace std;
    
    test1::test1()
    {
        cout << "hello world" << endl;
        int a = 10;
        cin >> a;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    注意:
    #ifndef XSOCKET_H
    #define XSOCKET_H
    预处理只是针对单个.cpp有效!

    八、pro项目文件中设置dll和lib的输出路径

    INCLUDEPATH += "../libDll"  //配置。h头文件
    LIBS += -L../lib -llibdll  //配置lib文件
    
    
    • 1
    • 2
    • 3

    九、qtcreator的debug版本和release版本配置和设置

    CONFIG(debug, debug|release){
        TARGET = libdll_d
    }else{
        TARGET = libdll
    }
    
    message($$TARGET)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    release和debug区别:
    1、debug版本在代码生成的二进制文件中,包含了很多调试信息。
    2、c++性能优化方便等等…

    十、跨平台就先不看了吧

  • 相关阅读:
    6.Tomcat概述与部署
    OpenMV输出PWM,实现对舵机控制
    Spring框架注解大全
    Kotlin--Sealed Class Sealed Interface
    mysql8.0英文OCP考试第21-30题
    【电路笔记】-平均电压和均方根电压(RMS Voltage)
    跟着架构师学习大型网站架构的技术细节:前端架构需要解决的问题
    Docker(1)
    算法刷题:经典TopK问题整理
    GLIP & DetCLIP
  • 原文地址:https://blog.csdn.net/zzyzxb/article/details/132941238