QT Creator在Windows上工作原理

QTCreator工作原理

其实,上文已经介绍了多的IDE的基本原理,但本文由于是介绍QTCreator,所以,会比较详细介绍QT Creator的工作原理。

    在新建项目之后,会生成相应的pro文件。pro文件,是对本次项目的详细描述。添加文件,会让相应的文件加到pro里面(如下图所示)。

 

然而,整个IDE最难的部分,是编译器功能。编译器功能设置如下:

     1)打开项目;

      2)可以看出相应的编译器设置情况。

 

可以得知,QT Creator的构建过程为“qmake.exe XXX.pro -spec win32-g++”。

       打开QT安装目录,随后进行对应的编译器选项。我个人的编译器为MinGW,然后,进入mingw53_32文件夹里面。然后进入mkspecs文件夹下面(即-spec所对应的文件夹)。然后,进入选项配置的win32-g++目录。

       win32-g++文件夹下面,只有两个文件:1)qmake.conf; 2)qplatformdefs.h。其中,qplatformdefs.h是用来对平台进行支持的。而编译选项的基本配置在qmake.conf里面。

        打开qmake.conf,可以看到最关键的几句话:

load(device_config)
include(../common/g++-base.conf)
 include(../common/angle.conf)
include(../common/gcc-base.conf)
 
load(qt_config)

可以得知,qmake文件,需要g++-base.conf,gcc-base.conf等文件的支持。同时,可以看到几个文件常量定义:

MAKEFILE_GENERATOR      = MINGW
QMAKE_PLATFORM          = win32 mingw
CONFIG                 += debug_and_release debug_and_release_target precompile_header
DEFINES                += UNICODE
QMAKE_COMPILER_DEFINES += __GNUC__ WIN32
 
QMAKE_EXT_OBJ           = .o
QMAKE_EXT_RES           = _res.o
 
 
QMAKE_CC                = $${CROSS_COMPILE}gcc
QMAKE_LEX               = flex
 
 
QMAKE_INCDIR            =
 
QMAKE_RUN_CC            = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src
QMAKE_RUN_CC_IMP        = $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
QMAKE_RUN_CXX           = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src
QMAKE_RUN_CXX_IMP       = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
 
QMAKE_LINK              = $${CROSS_COMPILE}g++
QMAKE_LINK_C            = $${CROSS_COMPILE}gcc
QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads

如果你对Makefile有了解,即可知道这些文件为Makefile的选项。

       gcc-base.conf文件的主要配置为:

QMAKE_CFLAGS_OPTIMIZE      = -O2
QMAKE_CFLAGS_OPTIMIZE_FULL = -O3
QMAKE_CFLAGS_OPTIMIZE_DEBUG = -Og
QMAKE_CFLAGS_OPTIMIZE_SIZE = -Os
 
 
 
QMAKE_CFLAGS               += -pipe
QMAKE_CFLAGS_DEPS          += -M
QMAKE_CFLAGS_WARN_ON       += -Wall -W
QMAKE_CFLAGS_WARN_OFF      += -w
QMAKE_CFLAGS_RELEASE       += $$QMAKE_CFLAGS_OPTIMIZE
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -g
QMAKE_CFLAGS_DEBUG         += -g
 
QMAKE_LFLAGS           +=
QMAKE_LFLAGS_DEBUG     +=
QMAKE_LFLAGS_APP       +=
QMAKE_LFLAGS_RELEASE   +=
QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO +=

g++-base.conf的主要选项为:

QMAKE_COMPILER          = gcc
 
QMAKE_CC                = gcc
 
QMAKE_LINK_C            = $$QMAKE_CC
QMAKE_LINK_C_SHLIB      = $$QMAKE_CC
 
QMAKE_CXX               = g++
 
QMAKE_LINK              = $$QMAKE_CXX
QMAKE_LINK_SHLIB        = $$QMAKE_CXX
 
QMAKE_PCH_OUTPUT_EXT    = .gch
 
 
QMAKE_CXXFLAGS_CXX11    = -std=c++11
QMAKE_CXXFLAGS_CXX14    = -std=c++1y
QMAKE_CXXFLAGS_CXX1Z    = -std=c++1z
QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11
QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y
QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
QMAKE_LFLAGS_CXX11      =
QMAKE_LFLAGS_CXX14      =
QMAKE_LFLAGS_CXX1Z      =

即规定了g++编译服从的C++标准。同时可以得知,QT Creator其实提供了可以扩展的标准。

   在这些配置之后,并运用 “qmake.exe XXX.pro -spec win32-g++” 这一命令,可以生成Makefile。Makefile在自己编译所在的路径之下(如图所示)。

      

    有Makefile,即可编译生成可以执行文件

 

pro文件与编译选项

     值得注意的是,常见的编译选项,可以通过修改pro文件,从而改变相应设置,从而打开或者关闭某些功能。举例如下:

     1)让release版本可以调试,可以在pro文件里,输入如下:

      

QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
     2)让QT Creator禁止O2优化

       

#Debug 禁止O2优化
QMAKE_CFLAGS_DEBUG -= -O2
QMAKE_CXXFLAGS_DEBUG -= -O2
 
#Release 禁止O2优化
QMAKE_CFLAGS_RELEASE -= -O2
QMAKE_CXXFLAGS_RELEASE -= -O2
4编译优化与禁止优化

     可执行程序,在正式发布的时候,会进行编译优化。

     编译器优化的原则是:减少不必要的值传递,从而使空间更小,速度更快。

     常见的优化方法为(更多可参考网址:https://www.jianshu.com/p/0caa9cfd995a,或者自己查阅更多资料):

    1)常量传播;
    2)常量折叠;
    3)复写传播;
   4)公共子表式消除;
   5)无用代码消除;
   6)数组范围检查消除;
   7)方法内联;
    8)逃逸分析。

   但优化会让调试的时候出问题。最常见的问题为,如果有优化,会发现调试的程序在源代码之间乱跳,而不知道具体的程序运行地址。

    优化的级别一般为O0、O1、O2、O3;一般情况下,在调试时,禁止O2优化即可达到目的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值