cmake的使用-为什么要使用CMake
介紹
代碼倉庫地址
https://github.com/zzu-andrew/linux-sys/tree/dfew/CMake為了將源碼轉化為最終用戶可以實際使用的東西,需要使用到編譯器、鏈接器、測試框架、打包系統等,這些都增加了開發高質量、健壯性軟件的復雜性,雖然一些IDE能夠將這些過程簡化一點,但是開發跨平臺的軟件并不是總能用到這些IDE的特性。
幸運的是, CMake就是一套可以使上述開發過程易于管理的一套工具,它涵蓋了從建立代碼工程到發布包的所有過程everything),CMake不僅涵蓋了所有的開發流程,還支持廣泛的平臺、工具和不同的編程語言。
CMake使用的幾個階段如下:
- 階段一、CMake最出名的階段-使用項目描述文件,生成特定平臺的項目文件,這些生成的項目文件適合開發者結合(make、Xcode、Visual Studio)使用。
- 階段二、使用階段一生成的構建工具構建工程工程(如 make)
- 階段三、后臺測試管理
- 階段四、打包管理
上述整個過程CMake都可以通過調用對應的工具完成,甚至構建工具(make)也可以被CMake調用。
建立一個工程
脫離構建系統,工程只是一個文件的集合。
CMakeLists.txt 是一個平臺無關的描述文件。CMake使用可讀文件CMakeLists.txt為工程的構建,制定了一些規則,定義了什么文件應該編譯以及如何編譯、跑那些測試和創建什么包,使用該描述文件生成特定平臺相關工程文件。
CMake的基本觀念就是項目同時要擁有一個源碼路徑和二進制文件目錄,源碼目錄是放置CMakeLists.txt 文件、源碼文件和一些需要構建的文件的地方,源碼目錄通處于git、subversion或者類似工具的版本控制之下。
所有構建過程生成的文件都會放置到二進制目錄,因此二進制目錄通常也被稱為構建目錄。本書中傾向于使用構建目錄,因為這樣更直觀。CMake調用構建工具(eg: make)、CTest和CPack的過程中會在構建目錄中生成一系列的文件,可執行文件、庫、測試輸出和包都在構建目錄中。CMake還會在構建目錄中生成一個名為CMakeCache.txt的特殊文件,用于存儲各種后期運行時可重用的信息,開發人員不需要關心CMakeCache.txt文件,后面章節會討論CMakeCache.txt文件。構建工具的項目文件也是在構建目錄中創建的(eg:makefile),這些CMake生成的文件不應該處于版本控制之下。
在源碼中構建
雖然不是很鼓勵這樣做,但是在使用CMake時是可以在源碼的目錄進行構建的,并將這種構建方式稱為內源構建in-source build,因為這種方式更加簡單,所以開發者剛開始通常會使用這種構建方式。
在源碼目錄進行構建的主要問題:
- 源碼和構建輸出都混雜在一起,使得工程的管理變得非常的困難
- 要承擔源文件可能被構建輸出覆蓋的風險
- 許多由構建穿件的文件,使得版本控制系統的工作變得更加的困難
- 清除所有構建輸出并使用干凈源碼樹并不是件容易的事情
基于以上原因,不建議開發人員在源碼中進行構建,即使是一個簡單的項目
在源碼外構建(out-of-source builds)
在源碼外構建更加可取,因為:
- 源碼與構建文件測地分離
- 開發人員可以為一份源碼創建多個構建目錄,比如調試和發布版本
本書將始終使用源碼外構建,并和遵循源目錄和構建目錄位于公共父目錄下的模式,構建根目錄將稱為build
一些開發人員會使用該方法的一些變體,將構建目錄作為源目錄的子目錄,這樣做雖然能顧有在源碼外構建的大部分優勢,但是讓然會有部分內源構建的部分缺點,除非有很好的理由這樣使用,否則建議將構建目錄完全置于源碼樹之外。
生成項目文件
目錄結構定下來后,開發人員可以運行CMake,它讀入CMakeList.txt文件并在構建目錄中創建項目文件。開發人員通過選擇特定的項目文件生成器,來選擇要創建的項目文件的類型。支持一系列不同的生成器,下表列出了更常用的生成器。
| Visual Studio | Visual Studio 15 2017 | YES |
| Visual Studio | Visual Studio 14 2015 | YES |
| Xcode | Xcode | YES |
| NinJa | NinJa | NO |
| Makefiles | UNIX Makefiles | NO |
| Makefiles | MSYS Makefiles | NO |
| Makefiles | MinGW Makefiles | NO |
| Makefiles | NMake Makefiles | NO |
Multi-config-是否支持多配置構建項目,支持就可以在不重新運行CMake的前提下構建不同的項目(eg: debug release)
最簡單的調用CMake方式
- 在構建目錄中將生成器類型和源碼目錄的位置傳遞給cmake
如果省略-G選項,cmake會根據主機的平臺選擇默認的生成器類型。對于所有的生成器類型,CMake將執行一系列的測試并詢問系統,以確定如何建立項目文件。這些工作包含驗證編譯器是否工作、確定支持的編譯器特性集和其他的各種任務,在CMake完成之前將會給出類似如下的日志信息:
-- Configuring done -- Generating done -- Build files have been written to: /some/path/build上面強調了項目文件的創建,實際上包含兩個步驟-配置和生成。在配置階段,CMake通過讀取CMakeLists.txt文件完成對整個項目的內部表示的構建。在完成這些之后,生成階段創建項目文件,配置和生成對與基本的CMake使用,并不是很重要,但是在后面的章節中,配置和生成分離變得很重要。會在Chapter 10, Generator Expressions.章節中進行更加詳細的介紹。
當首次完成CMake的運行時,它將在構建目錄中保存一個cmakecase.txt的文件,CMake使用這個文件來保存詳細信息,這樣當它再次運行時,他可以重用第一次計算的信息,并加速項目的生成。后面的章節將會介紹如何使用該文件在不同的運行之間保留開發者選項。CMake的gui程序使用將在第5章中進行介紹。
運行構建工具
此時,項目文件已經可用,開發人員可以按照他們習慣使用他們選擇的構建工具。構建目錄將包含必要的項目文件,這些文件可以加載到IDE中、通過命令行工具讀取等,或者CMake能夠代表開發者調用構建工具如:
cmake --build /some/path/build --config Debug --target MyApp使用Xcode或Visual Studio這樣IDE的開發者,更加習慣這種工作方式。build選項指向生成步驟中使用的構建目錄對于支持多配置生成器,config選項指定要構建哪個配置,而單個配置生成器將忽略--config選項,詳細信息將在第13章中進行介紹,target選項可以用來告訴構建工具要構建什么,或者如果省略將構建默認的目標。
雖然在日常開發中,開發人員通常自己調用構建工具,但是通過cmake進行調用在腳本驅動的自動化構建中更加的有用。使用這種方法,一個簡單的腳本構建如下:
mkdir build cd build cmake -G "Unix Makefiles" ../source cmake --build . --config Release --target MyApp如果開發人員想更換不同的生成器,所需要做的就是更改-G參數,然后將cmake將自動調用正確的構建工具。
建議
即使首次使用cmake也建議將構建目錄與源碼進行完全分離,為相同的源碼目錄設置兩個設置跟多不同的構建。
跨平臺工作的開發者,定期使用不同生成器進行構建
總結
以上是生活随笔為你收集整理的cmake的使用-为什么要使用CMake的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: starUML--面向对象的设计过程
- 下一篇: 作者:曾琛(1987-),女,就职于中国