目录
一、认识 Qt Creator
1.Qt Creator 概览
2.使用 Qt Creator 新建项目
2.1 新建项目
2.2 选择项目模板
2.3 选择项目路径
2.4 选择构建系统
2.5 填写类信息设置界面
2.6 选择语言和翻译文件
2.7 选择 Qt 套件
2.8 选择版本控制系统
2.9 最终效果
3.认识 Qt Creator 界面
3.1 左边栏
3.2 代码编辑区
3.3 UI设计界面
3.4 构建区
4. 项目文件解析
4.1 .pro 文件解析
4.2 widget.h 文件解析
4.3 main.cpp 文件解析
4.4 widget.cpp 文件解析
4.5 widget.ui 文件解析
编辑
4.6 中间文件解析
一、认识 Qt Creator
1.Qt Creator 概览
从 开始菜单 或者 快捷方式 打开 Qt Creator 集成开发环境,启动之后看到类似下面的界面:
①:菜单栏。菜单栏一共有 8 个菜单选项,包含了常用的功能菜单:
文件 | 包含了新建、打开、关闭项目和文件、打印和退出等基本功能。 |
编辑 | 包含了撤销、剪切、复制、查找和选择编码等功能。 |
构建 | 包含构建和运行项目等相关功能。 |
调试 | 包含调试运行项目等相关功能。 |
Analyze | 包含 QML 分析器、Valgrind 内存和功能分析器等相关功能。 |
工具 | 提供了快速定位菜单、外部工具菜单等。这里的选项菜单中包含了 Qt Creator 各个方面的设置选项:环境设置、文本编辑器设置、帮助设置、构建和运行设置、调试器设置和版本控制设置等。 |
控件 | 包含了设置窗口布局的一些菜单,如全屏显示和隐藏边栏功能等。 |
帮助 | 包含 Qt 帮助、Qt Creator 版本信息、报告bug和插件管理等菜单。 |
②:模式选择:
欢迎模式 | 主要提供了⼀些功能的快捷⼊⼝,如打开帮助教程、打开示例程序、打开项⽬、新建项⽬、快速打开以前的项⽬和会话、联⽹查看 Qt 官⽅论坛和博客等。示例页面显示了 Qt 自带的⼤量示例程序,并提供了搜索栏从而实现快速查找;教程页面提供了⼀些视频教程资源,但是是英文的。 |
编辑模式 | 主要⽤来查看和编辑程序代码,管理项⽬⽂件。Qt Creator 中的编辑器具有关键字特殊颜⾊显示、代码⾃动补全、声明定义间快捷切换、函数原型提示、F1 键快速打开相关帮助和全项⽬中进⾏查找等功能。也可以在 "⼯具---->选项 " 菜单中对编辑器进行设置。 |
设计模式 | 整合了 Qt Designer 的功能。可以设计图形界⾯,进行部件属性设置、信号和槽设置、布局设置等操作。 |
调试模式 | ⽀持设置断点、单步调试和远程调试等功能,包含局部变量和监视器、断点、线程以及快照等查看窗⼝。 |
项⽬模式 | 包含对特定项⽬的构建设置、运⾏设置、编辑器设置、代码风格设置和依赖关系等页面。构建设置中可以对项目的版本、使用的Qt版本和编译步骤进行设置;编辑器设置中可以设置⽂件的默认编码;在代码风格设置中可以设置自己的代码风格。 |
帮助模式 | 在帮助模式中将 Qt 助⼿整合了进来,包含目录、索引、查找和书签等几个导航模式,可以在帮助中查看 Qt 和 Qt Creator 的各⽅⾯信息。 |
③:构建套件选择器。构建套件选择器包含了目标选择器(Target selector)、运行按钮(Run)、调试按钮(Debug)和构建按钮(Building)四个图标。
⽬标选择器 | ⽬标选择器用来选择要构建哪个项目、使用哪个 Qt 库、这对于多个 Qt 库的项目很有⽤。还可以选择编译项⽬的 debug 版本或是 release 版本。 |
运⾏按钮 | 运行按钮可以实现项目的构建和运⾏。 |
调试按钮 | 调试按钮可以实现项目的调试。 |
构建按钮 | 构建按钮完成项⽬的构建。 |
④:欢迎模式下的窗口工作方式:
Project | 用来新建⼯程、打开⼯程。 |
示例 | Qt 官方的⼀些示例。 |
教程 | Qt 官方教程。 |
⑤:定位器。使用定位器来快速定位项目、文件、类、方法、帮助文档以及文件系统。可以使用过滤器来更加准确地定位要查找的结果。
⑥:输出窗格。输出窗格包含了问题、搜索结果(Search Results)、应用程序输出、编译输出、Debugger Console、概要信息、测试结果(Test Results)7个选项,它们分别对应⼀个输出窗口,响应的快捷键依次是 Alt+数字1~7。
问题 | 问题窗口显示程序编译时的错误和警告信息; |
Search Results | 搜索结果窗⼝显示执行了搜索操作后的结果信息; |
应⽤程序输出 | 应用程序窗口显示应⽤程序运行过程中输出的所有信息; |
编译输出 | 编译输出窗⼝显示程序编译过程输出的相关信息; |
⑦:会话记录;可以对会话进行管理,包括 Clone。如果没打开工程,则显示的是最后⼀次打开的(会话)工程,否则,显示当前的会话(工程)。
⑧:新建项目;
⑨:打开已有项目;
2.使用 Qt Creator 新建项目
2.1 新建项目
打开 Qt Creator ,在菜单栏中选中: "文件" --------> "新建文件或项目" ;或者使用快捷键:Ctrl + n;或者直接点击:"new";
在欢迎模式下,直接点击 New,如下图示:
2.2 选择项目模板
弹出如下对话框:
新建项目对话框里有五类项目模板:
项目模板 | 说明 |
Application | Qt 应用程序,包括普通窗体程序和 QtQuick 程序。 |
Library | 可以创建动态库、静态库以及 Qt Quick 扩展插件、QtCreator 自身插件。 |
其他项目 | 可以创建单元测试项目、Qt4 设计师自定义控件、子目录项目等。 |
Non-Qt-Project | 非 Qt 项目。可以创建纯 C 或纯 C++ 项目。 |
Import Project | 导入项目。从版本控制系统管理的软件项⽬导入旧的项目。 |
常用的只有第一类 Application,选择它,在右侧会看到 Qt 应用程序的五个子模板:
- Qt Widgets Application:普通窗体模板,传统基于部件的窗体界面程序。如果使用 Qt 写一个 GUI 程序,就应该选择这个。
- Qt Console Application:Qt 控制台应用程序。因为 Qt 主要用于图形界面设计,这个控制台项目模板基本不用。
- Qt for Python:在Python下用 LGPL 的许可来开发闭源 Qt 软件。
- Qt Quick Application: Qt 提供的⼀种高级用户界面技术,使用它可以方便快速的为移动以及嵌入式设备开发流畅美观的用户界面。Qt Quick 模块是开发 QML 应用的标准库,提供了使用 QML 创建用户界面所需的⼀切,包括可视化、交互、动画、模型、视图、粒子效果以及着色效果等。
🌻选择不同的项目模板, Qt Creator 就会在后续项目创建好了之后生成不同的基础代码。
2.3 选择项目路径
给 Qt 项目命名及选择保存项目的路径:
2.4 选择构建系统
选择 Qt 项目的构建系统,使用默认的 "qmake" 即可:
Qt 中的构建工具有三种可供选择,分别是:qmake、CMake、Qbs,下面依次介绍。
- qmake: qmake 是一个老牌的构建工具(build tool),用于自动生成 makefile 文件。qmake 支持跨平台构建。qmake 编辑的是一个后缀名为 .pro 的文件。
- CMake:CMake 是⼀个跨平台的构建工具,并非是 Qt 专属,很多的开源项目都会使用 CMake。CMake 本身不是一个编译器,其实就是生成⼀个让编译器能读懂编译流程的文件工具。让 CMake 自动生成构建系统,例如 Makefile 和 Visual Studio项目文件。CMake 是⼀个第三方工具,有自己的文档。
- Qbs:Qbs(Qt Build Suite:Qt构建套件)同 qmake、CMake ⼀样都是构建工具。Qbs 号称是新⼀代的构建工具,比 qmake 编译速度更快。Qbs 没有绑定 Qt 版本,它从项目文件的高级项目描述中生成⼀个正确的依赖表。而传统的 MakeFile 生成工具如 qmake 和 CMake ,其在生成 MakeFile文件后将实际的命令交给 Make 工具去执行。
- Qt 官方声明,因市场原因,弃用 Qbs 。对于 Qt 用户来说,qmake 是当前使用最广泛的构建工具, CMake 其次。
Qt 框架会在编译的时候,自动先调用一系列的生成工具,基于你自己写的代码,生成一系列的其他 C++ 代码,最终编译的代码,也是最后生成的这些代码。
2.5 填写类信息设置界面
①:使用 Qt Creator 创建项目,会自动的生成一些代码出来,生成的代码就包含一个类。此处就是要选择这个自动生成的类的父类是谁。
②:这个 form file 非常关键!
Qt 中创建图形化界面的程序,有两种方式。
- 直接通过 C++ 代码的方式来生成界面。
- 通过 form file,以图形化的方式来生成界面
此时,就可以通过 Qt Designer 或者直接使用 Qt Creator 来编辑这个 ui 文件,从而以图形化的方式快速方便的生成图形界面。
对于基类的选择,目前有三种基类:
基类 | 说明 |
QMainWindo w | 主窗口类,⼀般用于较为复杂的应用程序,除了中央客户区界面,还包括菜单栏、工具栏、状态栏以及多个可停靠的工具对话框等。 |
QWidget | 最简单、最基本的窗体程序,里面可以放置多个控件实现程序功能。 |
QDialog | 基于对话框的程序,对话框⼀般用于弹窗,也可以用于主界面显示。对话框是从QWidget继承而来的,并丰富了⼀些功能,如模态显示和返回值等。 |
上述三个类之间的关系如下图:
2.6 选择语言和翻译文件
点击 "下一步" 进入如下界面:
此处选择的语言是 "汉语", "英语" 这样的语言. 而不是 "编程语言"。
由于我们暂时不考虑国际化问题, 直接下一步即可。
2.7 选择 Qt 套件
选择一下基于那个编译器的 Qt SDK 来构建后序代码,默认只有第一个 "Desktop Qt 5.14.2 MinGW 64-bit",如果安装配置了多个 Qt 套件,就可以都选上。
Qt 套件是指 Qt 程序从编译链接到运行环境的全部工具和 Qt 类库的集合,对于 MinGW 版本 Qt 程序生成和调试,至少需要 MinGW 中的编译器 g++(自动调用链接器)、g++ 配套的基础库、调试器 gdb 还有使用 MinGW 环境编译而成的 Qt 类库自身。默认情况下,在上面 Kit Selection 里选中全部套件。
2.8 选择版本控制系统
点击 "下一步" 进入 项目管理界面;在项目管理界面可以设置作为子项目,以及加入版本控制系统管理。这两个功能暂时用不到,都用默认的 <None> ,然后点击 "完成" 。
如果想把代码提交到码云或者 github, 可以在此处选择 git 作为版本控制系统。
2.9 最终效果
通过上述 8 个步骤, 完成了项目的创建。
项目创建完成之后,Qt Creator 会直接进入代码编辑模式,可以看到类似下图界面:
3.认识 Qt Creator 界面
3.1 左边栏
在编辑模式下,左边竖排的两个窗口叫做 "边栏" 。① 是项目文件管理窗口,② 是打开文件列表窗口。在 QtCreator 菜单 "控件" -------> "Show Left Sidebar",或者使用快捷键:"Alt + 0" 可以控制边栏的显示和隐藏。
边栏里的窗口数目可以增加,边栏子窗口标题栏有一排小按钮,最右边的是关闭按钮,倒数第二个是增加分栏按钮,可以添加多个边栏子窗口。
边栏子窗口标题栏第一个控件是组合框,可以选择该子窗口的功能视图类型,目前可以选择 8 个视图类型:
视图类型 | 说明 |
项⽬ | 即项⽬⽂件管理视图,可以选择项⽬⾥的⽂件进⾏编辑,包括 pro ⽂件也可以⼿动编辑。 |
打开⽂档 | 当前已经打开的⽂件列表,⽂件名右边如果有 * 号,是该⽂件被修改了但尚未保存。 |
书签 | 右击代码编辑器⾏号位置,看到 "切换书签",可以给代码⾏添加书签,⽅便跳转到该位置。 |
⽂件系统 | 相当于系统⾥的⽂件资源管理器,可以查看项⽬⽂件夹在磁盘⾥的实际⽂件列表。 |
类视图 | 可以查看项⽬⾥包含的类及相应源代码⽂件⾥的成员函数、成员变量。 |
Git Branches | 查看当前分⽀。 |
⼤纲 | 编辑器所显⽰的当前⽂件的⼤纲列表,如名字空间、类名、成员函数、成员变量等。 |
Tests | 测试 |
类型层次 | 当前项⽬包含的类及其基类、派⽣类列表。 |
Include Hierarchy | 包含视图,显⽰当前项⽬⾥ *.h 、*.cpp 以及 Qt 类库头⽂件之间的包含关系。 |
3.2 代码编辑区
①和②:导航按钮 "返回" 和 "前进",这与网页浏览器的前进和后退按钮类似,可以在之前浏览的多个代码文件或⼀个代码文件里多个位置之间快速切换。
③:标识当前显示的文件是只读还是可写,⼀般都是可写的。
④:文件类型图标,当前显示文件的类型,这个控件其实是⼀个菜单按钮,点击可以弹出丰富的⽂件处理功能菜单。
⑤:打开的文件名,可以在多个打开的文件之间选择切换,与边栏的 "打开文档" 视图是对应的。
⑥:关闭当前显示的文档。
⑦:为当前显示的文件添加额外的C++预处理指令,⼀般用不着。
⑧:选择符号,可以在当前显示的文件里多个函数、类、成员变量等之前快速切换,与边栏"大纲"视图是对应的。
⑨:编辑区光标的行号和列号。
⑩:代码编辑区分栏,可以增加多个编辑器窗⼝,显示多个打开的文档或显示较大源码文件的多个位置。
行首区:主要用来显示代码行号,以及调试断点标志和代码书签标志。右击行首区可以弹出右键菜单,菜单里可以切换书签、编辑书签以及设置或取消断点。
同一行是既可以打断点也可以设置书签的,二者不冲突,其实它们根本就没关系。单击行号前面的浅灰色空白区可以直接打断点,再次单击可以取消断点,另外也可以用快捷键 F9 设置或取消断点。代码书签⼀般用右键菜单来设置,也可以用快捷键 Ctrl+M 设置或取消书签。
编辑区:写代码的区域。
3.3 UI设计界面
双击 widget.ui 文件,Qt Creator 会自动进入设计模式,可以对图形界面进行可视化编辑:
①:组件选择窗口。组件选择窗口分为多个组,如 Layouts、Buttons、Display Widgets 等,界面设计的常见组件都可以在组件选择窗口中找到。
②:UI 设计窗口。如果要将某个组件放置到该窗口上时,从组件选择窗口上拖放一个组件到窗体上即可。
③:动作编辑窗口。动作编辑窗口包括 Action Editor 以及 Signals 和 Slots 编辑器。 Action Editor 主要是用来新建 Action,并且通过拖拽的动作,将新建好的 Action 添加到菜单栏和工具栏上;Signals和 Slots 编辑器用于可视化地进行信号与槽的关联。
④:对象浏览窗⼝。用树状视图显示窗体上各组件之间的布局包含关系,视图有两列,显示每个组件的对象名称(ObjectName)和类名称。
⑤:属性设置窗口。显示某个选中的组件或窗体的各种属性及其取值,可以在属性设置窗口里修改这些属性的值。
3.4 构建区
左下角一共有四个按钮,下面分别介绍一下:
- 第一个按钮是选择构建项目使用的 Qt 套件和构建目标程序的类型(Debug 或 Release)。
对于第一个按钮,默认的是Debug,构建的是 Debug 类型的目标程序。如果需要构建 Release 版目标程序,点开左下角第一个按钮:
这里有三种构建模式:
模式 | 说明 |
Debug | 以 "-g" 模式编译,带着符号信息,优点是便于调试。 |
Profile | profile 则是在 "Debug" 和 "Release" 之间取一个平衡,兼顾性能和调试,可以类似的看做是性能更优又方便调试的版本。 |
Release | "Release" 是经过优化之后,性能比 "Debug" 更上⼀个档次。 |
上图是针对项目只用到单一 Qt 套件的,如果之前配置了多个 Qt 套件,看到的类似下图:
如果项目配置了多个可用的 Qt 套件,点开左下角第⼀个按钮后,会看到各个套件以及构建类型,如果要切换 Qt 套件或构建类型,直接选中相应条目,然后点击运行按钮就行了。如果构建和运行时没出错,就会显示出构建好的目标程序界面。
- 第二个是运行按钮,快捷键是 Ctrl+R,如果还没构建项目或刚修改了代码,直接点击运行的话,QtCreator 会自动构建生成新的目标程序并运行。
- 第三个是调试按钮,快捷键是 F5。调试程序之前,QtCreator 会自动构建生成最新的目标程序,并进入调试模式。
- 第四个是构建按钮,快捷键是 Ctrl+B,只构建最新的目标程序,但不运行。
4. 项目文件解析
4.1 .pro 文件解析
工程新建好之后,在工程目录列表中有一个后缀为 ".pro" 的文件, ".pro" 文件就是工程文件 (project) ,它是 qmake 自动生成的用于生产 makefile 的配置文件。如图所示:
双击进入该文件,该文件的核心内容如下:
- QT += core gui // 要引入的 Qt 的模块
- greaterThan(QT_MAJOR_VERSION, 4): QT += widgets // 大于 Qt4 版本才包含 widget 模块
- TARGET = QtFirst // 应用程序名生成的 .exe 程序名称
- TEMPLATE = app // 模板类型,应用程序模板
- SOURCES += main.cpp\ // 源文件
- widget.cpp // 源文件
- HEADERS += widget.h // 头文件
".pro" 文件的写法如下:
1. 注释:从 "#" 开始,到这一行结束。
2. QT += core gui // Qt 包含的模块
Qt5 包含的模块如下图所示:
3. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 这条语句的含义是,如果QT_MAJOR_VERSION 大于 4 也就是当前使用的 Qt5 及更高版本) 需要增加 widgets 模块。如果项目仅需支持 Qt5 , 也可以直接添加 "QT += widgets" 一句。不过为了保持代码兼容 ,最好还是按照 QtCreator 生成的语句编写。
4. 指定生成的应用程序名:TARGET = QtDemo
5. TEMPLATE = app //模板。告诉 qmake 为这个应用程序生成哪种 makefile。下面是可供选择的模板:
- app:建立一个应用程序的 makefile。这是默认值,所以如果模板没有被指定,这个将被用。
- lib :建立一个库的 makefile。
- vcapp:建立一个应用程序的 VisualStudio 项目文件。
- vclib: 建立一个库的 VisualStudio 项目文件。
- subdirs:这是一个特殊的模板,它可以创建一个能够进入特定目录的 makefile 并且为它调用 make 的 makefile。
6. ⼯程中包含的源文件:SOURCES += main.cpp/widget.cpp
7. ⼯程中包含的头文件:HEADERS += widget.h
8. ⼯程中包含的资源文件:RESOURCES += painter.qrc
9. ⼯程中包含的 "ui" 设计文件:FORMS += widget.ui
10. 配置信息:CONFIG += c++11 (使用 c++11 的特性) CONFIG 用来告诉 qmake 关于应用程序的配置信息。
4.2 widget.h 文件解析
在Qt中,如果要使用信号与槽(signal 和 slot)的机制 就必须加入 Q_OBJECT 宏;
Ui::Widget *ui; 这个指针是用前面声明的 namespace Ui 里的 Widget 类定义的,所以指针 ui 是指向可视化设计的界面,后面要访问界面上的组件,都需要通过这个指针 ui 去访问。
1. #ifndef WIDGET_H #define WIDGET_H 的意思是保证头文件只被包含一次,更推荐写作 #pragma once
2. #include <QWidget>: 这个里头就是 Widget 类的声明。
3. class Widget : public QWidget 中的 QWidget 是创建项目时,选择的父类,是 Qt SDK 内置的,要想使用这个类,就需要包含对应的头文件 #include <QWidget>。
Qt 的设定,使用 Qt 中内置的类,包含的头文件的名字就是和类名一致的。当然,也不是用到的所有的 Qt 的类都需要显示包含头文件。
C++ 中,头文件可能是 “间接包含的”,比如,引入了 a.h ,a.h 里又包含了 b.h 此时,就相当于把 a.h 和 b.h 都包含了。
后序写代码的原则,一个 Qt 的类,先拿过来用,如果直接能用,说明对应的头文件已经被间接包含过了,无需显示包含。如果这个类提示找不到定义啥的,手动的显示把对应的头文件给包含一下就行了。
4. Q_OBJECT 是一个Qt 内置的宏,宏本质上是文本替换。Q_OBJECT 展开之后,就会生成一大堆的代码。Qt 中有一个非常核心的机制,“信号 和 槽”,如果某个类想使用 “信号 和 槽” 就需要引入 Q_OBJECT 这个宏。
5. (QWidget *parent = nullptr) :Qt 中引入了 “对象树”机制,创建的 Qt 对象,就可以把这个对象给挂到树上,往树上挂的时候就需要指定 “父节点”。 注意,此处的 对象树 是一个普通的 N 叉树(不是二叉)。
4.3 main.cpp 文件解析
使用 Qt Creator 新建任意工程之后,main.cpp 文件中都会自动生成如下代码:
解释:
1. Qt 系统提供的标准类名 声明头文件没有 .h 后缀;
2. Qt 一个类对应一个头文件,类名 就是 头文件名;
3. QApplication 为应用程序类;QApplication a;(a为应用程序对象,有且仅有一个。)
- QApplication 管理图形用户界面应用程序的控制流和主要设置。
- QApplication 是 Qt 的整个后台管理的命脉。它包含主事件循环,在其中来自窗口系统和其它资源的所有事件处理和调度。它也处理应用程序的初始化和结束,并且提供对话管理。
- 对于任何一个使用 Qt 的图形用户界面应用程序,都正好存在一个 QApplication 对象,而不论这个应用程序在同一时间内是不是有 0、1、2 或更多个窗口。
4. Widget w; //实例化窗口对象
5. w.show(); //创建一个控件对象,并显示出来;.show() 方法让控件显示出来;.hide()方法让控件隐藏
6. a.exec() :程序进入消息循环,等待对用户输入进行响应。这里 main()把控制权转交给Qt,Qt 完成事件处理工作,当应用程序退出的时候 exec() 的值就会返回。在 exec() 中,Qt 接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。
4.4 widget.cpp 文件解析
widget.cpp 文件是类 Widget 的实现代码,所有在窗体上要实现的功能添加在此文件中;
4.5 widget.ui 文件解析
widget.ui 是窗体界面定义文件,是一个 XML 文件,定义了窗口上的所有组件的属性设置、布局,及其信号与槽函数的关联等。用 UI 设计器可视化设计的界面都由 Qt 自动解析,并以 XML 文件的形式保存下来。在设计界面时,只需在 UI 设计器里进行可视化设计即可,而不用管 widget.ui 文件是怎么生成的。
当直接双击 ui 文件,此时 Qt Creator 就会调用 Qt Designer,打开 ui 文件。图形化的界面编辑器。
此时再点击左侧的 “编辑” 按钮,显示出来的内容就是 .ui 文件的本体了。
这个格式称为 xml 格式。xml 和 html 非常类似,都是使用成对的标签来表示数据。xml 这里有哪些标签,都表示什么含义,这个是程序员自定义的。此刻看到的这些标签,就是开发 Qt 的大佬们来约定的。这里的标签具体是啥含义,咋们不需要关注,只需知道 ui 文件本质上是一个 xml 即可。
html 虽然也是通过标签来表示,但 html 的标签都是固定的,每个标签是啥含义,有一个专门的标准委员会约定,所有的浏览器也是按照同样的规则来解释的。
Qt 中使用 xml 文件就是去描述程序的界面是啥样的,进一步的 qmake 会调用相关的工具,依据这个 xml 文件生成一些 C++代码,从而把完整的界面构造出来。
4.6 中间文件解析
上面看到的 .pro .h .cpp .ui 都是源代码。如果编译运行 Qt 项目,构建过程中还会生成一些中间文件。鼠标右击 .pro文件,点击 在Explorer中显示 就会打开文件资源管理器,此时,就可以看到项目中对应的目录是啥样子了~
在运行一次程序之后,就会在 项目目录 并列的地方,多出来一个 “build-xxxxxx”目录,这个目录里面就是该项目运行过程中,生成的一些临时文件。
在 debug 文件夹里面会有下列源文件: