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优化即可达到目的。