• 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++性能优化方便等等…

    十、跨平台就先不看了吧

  • 相关阅读:
    Mac M1采用docker安装工具
    C++模板特化的两种形式:全特化和部分特化
    Java反射详解
    KubeVela可持续测试应用部署之Mock基础设施
    ACWING/4262. 空调
    [软件安装]anaconda安装
    lammps提取和保存data文件中力场参数的技巧
    热熔胶行业调研:2022年热熔胶市场发展现状与前景分析
    C算法:输入一个数n,输出1到n之间所有的质数
    linux(全志F1C100S/F1C200S)系列10:参考
  • 原文地址:https://blog.csdn.net/zzyzxb/article/details/132941238