Qt源碼分析之概述

現代的代碼項目都使用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目錄

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這樣的形式.

相關文章
相關標籤/搜索