cmake 簡(jiǎn)介
時(shí)間:2016-12-30作者:華清遠(yuǎn)見
前言: cmake是kitware公司以及一些開源開發(fā)者在開發(fā)幾個(gè)工具套件(VTK)的過程中所產(chǎn)生的衍生品。后來經(jīng)過發(fā)展,終形成體系,在2001年成為一個(gè)獨(dú)立的開放源代碼項(xiàng)目。其官方網(wǎng)站是www.cmake.org,可以通過訪問官方網(wǎng)站來獲得更多關(guān)于cmake的信息,而且目前官方的英文文檔比以前有了很大的改進(jìn),可以作為實(shí)踐中的參考手冊(cè)。 cmake的流行離不開KDE4的選擇。KDE開發(fā)者在使用autotools近10年之后,終于決定為KDE4項(xiàng)目選擇一個(gè)新的工程構(gòu)建工具。之所以如此,用KDE開發(fā)者們自己話來說,就是:只有少數(shù)幾個(gè)“編譯專家”能夠掌握KDE現(xiàn)在的構(gòu)建體系。在經(jīng)歷了unsermake,scons以及cmake的選型和嘗試之后,KDE4終決定使用cmake作為自己的構(gòu)建系統(tǒng)。在遷移過程中,進(jìn)展一場(chǎng)的順利,并獲得了cmake開發(fā)者的支持。所以,目前的KDE4開發(fā)版本已經(jīng)完全使用cmake來進(jìn)行構(gòu)建。 隨著cmake 在KDE4項(xiàng)目中的成功,越來越多的項(xiàng)目正在使用cmake作為其構(gòu)建工具,這也使得cmake正在成為一個(gè)主流的構(gòu)建體系。 一、為何要使用項(xiàng)目構(gòu)建工具? 為何要使用cmake和autotools之類的項(xiàng)目構(gòu)建工具? 我想,這恐怕是剛剛接觸軟件項(xiàng)目的人應(yīng)該問的問題之一了。 “Hello, world!“這個(gè)經(jīng)典的程序相信我們每個(gè)人都寫過。無論在什么平臺(tái)下,編譯和運(yùn)行這個(gè)程序都僅需要非常簡(jiǎn)單的操作。但事實(shí)上,hello,world多只能算是一個(gè)實(shí)例程序,根本算不上一個(gè)真正的軟件項(xiàng)目。 任何一個(gè)軟件項(xiàng)目,除了寫代碼之外,還有一個(gè)更為重要的任務(wù),就是如何組織和管理這些代碼,使項(xiàng)目代碼層次結(jié)構(gòu)清晰易讀,這對(duì)以后的維護(hù)工作大有裨益。使想一下,如果把一個(gè)像KDE4那么大的項(xiàng)目像hello world那樣,把全部代碼都放到一個(gè)main.cpp文件中,那將會(huì)是多么恐怖的一件事情。別說KDE4,就是我們隨便一個(gè)幾千行代碼的小項(xiàng)目,也不會(huì)有人干這種蠢事。
決定代碼的組織方式及其編譯方式,也是程序設(shè)計(jì)的一部分。因此,我們需要cmake和autotools這樣的工具來幫助我們構(gòu)建并維護(hù)項(xiàng)目代碼。 其實(shí),cmake和autotools正是makefile的上層工具,它們的目的正是為了產(chǎn)生可移植的makefile,并簡(jiǎn)化自己動(dòng)手寫makefile時(shí)的巨大工作量。如果你自己動(dòng)手寫過makefile,你會(huì)發(fā)現(xiàn),makefile通常依賴于你當(dāng)前的編譯平臺(tái),而且編寫makefile的工作量比較大,解決依賴關(guān)系時(shí)也容易出錯(cuò)。因此,對(duì)于大多數(shù)項(xiàng)目,應(yīng)當(dāng)考慮使用更自動(dòng)化一些的cmake或者autotools來生成makefile,而不是上來就動(dòng)手編寫。 總之,項(xiàng)目構(gòu)建工具能夠幫我們?cè)诓煌脚_(tái)上更好地組織和管理我們的代碼及其編譯過程,這是我們使用它的主要原因。 二、cmake的主要特點(diǎn):
cmake和autotools是不同的項(xiàng)目管理工具,有各自的特點(diǎn)和用戶群。存在即為合理,因此我們不會(huì)對(duì)兩者進(jìn)行優(yōu)劣比較,這里只給出cmake的一些主要特點(diǎn): 三、安裝cmake 安裝cmake 對(duì)任何用戶而言都不該再成為一個(gè)問題。幾乎所有主流的Linux發(fā)行版的源中都包含有cmake的安裝包,直接從源中添加即可。當(dāng)然,也可以在官方網(wǎng)站下載源代碼自行編譯安裝。 對(duì)于Windows和Mac用戶,cmake的官方網(wǎng)站上有相應(yīng)的安裝包,下載安裝即可,無須贅述。
注:為了能夠測(cè)試本文中的實(shí)例程序,如果讀者的Linux系統(tǒng)中所帶的cmake版本低于2.6,請(qǐng)從官網(wǎng)下載2.6版本或以上的源代碼進(jìn)行編譯并安裝。
首先下載源碼包
隨便找個(gè)目錄解壓縮 四、從“Hello, world!”開始 了解cmake的基本原理并在系統(tǒng)中安好cmake后,我們就可以用cmake來演示那個(gè)經(jīng)典的”Hello, world!”了。 第一步,我們給這個(gè)項(xiàng)目起個(gè)名字——就叫HELLO吧。因此,第一部為項(xiàng)目代碼建立目錄hello,與此項(xiàng)目有關(guān)的所有代碼和文檔都位于此目錄下。
第二步,在hello目錄下建立一個(gè)main.c文件,其代碼如下:
第三步,在hello目錄下建立一個(gè)新的文件CMakeLists.txt,它就是cmake所處理的“代碼“。其實(shí),使用cmake管理項(xiàng)目本身也是在編程,所以稱之為“代碼(或腳本)”并不為過。在CMakeLists.txt文件中輸入下面的代碼(#后面的內(nèi)容為代碼行注釋): 至此,整個(gè)hello項(xiàng)目就已經(jīng)構(gòu)建完畢,可以進(jìn)行編譯了。 第四步,編譯項(xiàng)目。
為了使用外部編譯方式編譯項(xiàng)目,需要先在目錄hello下新建一個(gè)目錄build(也可以是其他任何目錄名),F(xiàn)在,項(xiàng)目整體的目錄結(jié)構(gòu)為: 在windows下,cmake提供了圖形界面,設(shè)定hello為source目錄,build為二進(jìn)制目錄,然后點(diǎn)擊configure即可開始構(gòu)建,之后進(jìn)入build目錄運(yùn)行make命令編譯。
在linux命令行下,首先進(jìn)入目錄build,然后運(yùn)行命令(注:后面的“..”不可缺少):
該命令使cmake檢測(cè)編譯環(huán)境,并生成相應(yīng)的makefile。接著,運(yùn)行命令make進(jìn)行編譯。編譯后,生成的所有中間文件和可執(zhí)行文件會(huì)在build目錄下。 下面是我在ubuntu上的運(yùn)行過程: 上面,我們提到了一個(gè)名詞,叫外部編譯方式。其實(shí),cmake還可以直接在當(dāng)前目錄進(jìn)行編譯,無須建立build目錄。但是,這種做法會(huì)將所有生成的中間文件和源代碼混在一起,而且cmake生成的makefile無法跟蹤所有的中間文件,即無法使用”make distclean”命令將所有的中間文件刪除。因此,我們推薦建立build目錄進(jìn)行編譯,所有的中間文件都會(huì)生成在build目錄下,需要?jiǎng)h除時(shí)直接清空該目錄即可。這就是所謂的外部編譯方式。
相關(guān)資訊
發(fā)表評(píng)論
|