现代的代码项目都使用git管理,qt也不例外,若是一个项目由不少子项目组成,可使用git的submodule机制.git
git官方的发布仓库在http://code.qt.io,这是一个只读的仓库镜像,做为一个具备规模的项目,成员之间的合做须要遵循一些流程,虽然这会看起来有些麻烦.若是想给Qt贡献代码,稍微有些麻烦,具体见 http://wiki.qt.io/Qt_Contribution_Guidelineswindows
下面分析Qt项目的结构,以Qt5.7为例.bash
http://code.qt.io/cgit/qt/qt5.git/tree/?h=5.7ide
是Qt的主仓库,包含coin持续集成脚本,configure脚本,init-repository仓库初始化脚本和其它子模块的引用.工具
若是使用git从这里下载代码,则下载后须要使用init-repository 下载其它子仓库,该工具还包含了更新仓库等其它帮助命令.若是不是给Qt贡献代码或者想本身编译一个开发中的版本,不建议使用git仓库.若是是开发版的话,可能由于代码不稳定,编译的时候会出现各类问题.咱们使用官方正式发布某个版本时自带的打包好的源码进行学习和分析.http://download.qt.io/official_releases/qt/5.7/5.7.0/single/学习
├── coin 持续集成脚本
├── gnuwin32 用于win32的构建工具
├── qtbase Qt基础仓库
├── qtdoc 主帮助文档项目
├── qttools Qt各类工具,如帮助系统/设计器/语言家/部署帮助等,通常生成后在Qt的bin目录
├── qttranslations 翻译文件
├── ******
└── 其它Qt子模块测试
Qt5分为Essential和Add-Ons两个部分,http://doc-snapshots.qt.io/ 前者包含Qt最核心的功能,后者为非必要或不经常使用模块.Essential包含了qtbase和其它几个核心仓库.ui
代码根目录下有一个README文件,描述了编译Qt所须要的环境和依赖.qt的每一个模块代码都是一个Qt项目,使用pro项目维护.可是咱们要编译Qt就要重新开始,而不是用Qt编译Qt.spa
根目录下提供了unix类系统和windows系统的配置文件configure,它指向了qtbase下的同名文件.真正的配置脚本在这里.详细的配置选项能够经过./configure --help > help.txt输出到文件查看.插件
若是想编译源码,建议不要在源码目录之间编译,而是单独创建一个build目录,而后在build目录执行配置脚本.如
../qtsrc/configure -prefix $PWD/qtbase -developer-build -opensource -confirm-license -opengl es2 -nomake examples -nomake tests
配置文件指定了各个工具和模块的编译顺序,依赖知足状况,编译参数等.固然也能够指定仅需也的模块和排除某些模块.
固然在真正配置和编译前,咱们须要参考https://wiki.qt.io/Building_Qt_5_from_Git 来安装必要的依赖包,不然不能编译或者某些模块不会被编译.执行configure命令后,脚本会首先检查各个模块所需有的环境是否知足.若是某个须要的模块不知足依赖咱们须要安装对应的环境.
配置好后,能够经过make -jN来构建所有或make -jN module-xxxx构建部分模块
对于一些不成熟的版本或模块进行编译时,建议使用构建版本参数使用 -developer-build,这样一些私有的模块和头文件会包含进来.
构建后的目录
├── bin 可执行文件
├── config.tests
├── include 全部模块的头文件
├── lib 因此模块的库文件
├── mkspecs
├── plugins Qt插件
├── qmake
├── qml qml插件和资源
└── src 编译过程当中使用的makefile等
qtbase既是最基本的源码目录,也是编译生成文件的存放目录,若是编译时版本选型为-developer-build,则其它模块生成的库和头文件也会安装在此目录,从而无需执行make install便可
├── bin 编译后的可执行文件
├── config.tests 编译条件测试文件
├── dist 修改记录
├── doc 文档
├── examples 实例
├── include 头文件
├── lib 编译生成的lib文件
├── mkspecs 编译器参数配置文件
├── qmake qmake工具
├── src base模块代码
├── tests
├── tools
└── util
Qt的每一个模块目录结构基本同样,
├── dist 修改记录
├── doc
├── examples
├── include 头文件
├── src
└── tests
每一个模块的头文件在模块目录下的include文件夹,在编译的时候,将里面所有内容拷贝到qtbase下的include内. 在模块开发中,既用到了目录内的公共头文件,也用到了私有头文件.
私有头文件通常在include/分组名称/Qt版本号/分组名称/privte目录,其中前半部分include/分组名称/Qt版本号 被添加进构建系统的include变量,因此模块中通常包含的私有头文件为 分组名称/privte/xxx_p.h这样的形式.