CMake 簡介與使用

2017.07.05

本文希望用短平快的方式励背,解決Cmake軟件的安裝配置使用問題瑟枫,更進一步的參數配置與工程測試斗搞、報錯問題解決,可以參考他人文檔慷妙,眾人拾柴火焰高僻焚,整理好的相關資源鏈接也一并列出。

簡介

CMake是眾多Make工具中的一種膝擂,就是對代碼進行編譯虑啤,測試以及打包操作。

Make工具里面架馋,比較出名的有GNU Make狞山,QT 的qmake,微軟的MS nmake叉寂,BSD Make(pmake)萍启,Makepp,等等。這些 Make 工具遵循著不同的規(guī)范和標準勘纯,所執(zhí)行的 Makefile 格式也千差萬別局服。這樣就帶來了一個嚴峻的問題:如果軟件想跨平臺,必須要保證能夠在不同平臺編譯驳遵。而如果使用上面的 Make 工具淫奔,就得為每一種標準寫一次 Makefile ,這將是一件讓人抓狂的工作堤结。

而每次對出現的問題進行解決搏讶,即是一次對效率化的貢獻。因此CMake應運而生霍殴。

它可以讓程序員通過一個與開發(fā)平臺無關的CMakeList.txt文件來定制整個編譯流程媒惕,然后再根據目標用戶的平臺進一步生成所需的Makefile和工程文件,如*nix平臺的Makefile或者win平臺下面的VS工程来庭。也是一種“Write once, run everywhere”妒蔚。

一些比較出名的開源項目以及商業(yè)項目,也都是采用CMake作為項目架構系統(tǒng)月弛,比如KDE以及OpenCV肴盏,奈飛(Netflix),第二人生(Second Life)帽衙,還有LLVM 和Clang菜皂,MySQL等等。

安裝

官網是https://cmake.org?


https://cmake.org/download/ 這里可以下載到對應不同平臺的安裝包厉萝,這里分為源碼包以及二進制可執(zhí)行文件兩類恍飘。然后根據需要進行下載安裝就好了,對于*nix下面的安裝谴垫,可以看另一篇帖子章母。


使用

CMake可以支持win和*nix,通過在平臺環(huán)境上進行搜索用于build的文件,windows+VS環(huán)境下翩剪,可以幫你生成.sln,vcxproj文件乳怎,而在*nix則是makefile,同理MAC OS則是xcode的項目文件前弯。

程序員就可以使用CMakeLists.txt配置文件在本地編譯蚪缀,鏈接文件,生成這些項目恕出。

例如先創(chuàng)建一個小程序:


然后在相同目錄下創(chuàng)建一個CMakeLists.txt文件

其中第一行是 最低的版本號要求询枚,一般默認寫2.6,方便兼容

第二行是項目信息剃根,也就是項目名稱

第三行是指定生成目標哩盲,也就是生成可以被開發(fā)環(huán)境使用的工程項目文件

然后運行控制臺,切換到當前項目路徑里面狈醉,用 cmake . 運行程序


這里用VS11.0 完成了編譯廉油,也是CMake自動搜索配置路徑得到的。


這里你可以看到苗傅,就自動從cpp源文件生成了一個完整的VS項目工程抒线。


如果有多個源文件存在,則修改CMakeLists.txt渣慕,在制定目標那一行的文件后面進行添加操作

如果源文件眾多嘶炭,還可以使用aux_source_directory命令,它可以查找指定目錄下的所有源文件逊桦,將結果存進指定變量名眨猎,語法格式如下:

aux_source_directory(<dir><variable>)


這樣,CMake 會將當前目錄所有源文件的文件名賦值給變量DIR_SRCS强经,再指示變量DIR_SRCS中的源文件需要編譯成一個名稱為 Demo 的可執(zhí)行文件睡陪。


如果是多個目錄,多個源文件匿情,例如路徑有一個show文件夾兰迫,里面包括show.c和show.h

那么需要分別在項目根目錄 test 和 show 目錄里各編寫一個 CMakeLists.txt 文件。為了方便炬称,我們可以先將 show 目錄里的文件編譯成靜態(tài)庫再由 main 函數調用汁果。

這種情況下,根目錄test里面的CMakeLists.txt需要改為:


使用命令add_subdirectory指明本項目包含一個子目錄 test玲躯,這樣 test 目錄下的 CMakeLists.txt 文件和源代碼也會被處理 据德。第6行,使用命令target_link_libraries指明可執(zhí)行文件 nihao 需要連接一個名為 test 的鏈接庫 跷车。

下面是修改子目錄中的CMakeLists.txt如下:


也是類似晋控,使用命令add_library將 src 目錄中的源文件編譯為靜態(tài)鏈接庫。

如果目錄在其他路徑姓赤,則可以在test項目目錄一層CMakeLists里面添加

include_directories ("${PROJECT_SOURCE_DIR}/show")

進階

我們可以讓這個庫是可選赡译,因為如果使用更大的庫或者依賴于第三方的庫時,會有這個需求不铆。

也是在頂層的CMakeLists添加

option(USE_SHOW"Use test provided display function"ON)

這個設置會顯示在CMake的GUI中蝌焚,并且其默認值為ON。當用戶選擇了之后誓斥,這個值會被保存在CACHE中只洒,這樣就不需要每次CMAKE都進行更改了。

下面就繼續(xù)構建和鏈接Show庫劳坑。為了達到這個目的毕谴,我們可以改變頂層的CMakeLists文件:


配置文件configure_file命令用于加入一個配置頭文件 config.h ,這個文件由 CMake 從config.h.in生成,通過這樣的機制涝开,可以預定義一些參數和變量來控制代碼的生成循帐。

在添加函數庫這里使用了USE_SHOW來決定我們自己的庫show是否會被編譯和使用。注意這里變量EXTRA_LIBS的使用方法舀武。這是保持一個大的項目看起來比較簡潔的一個方法拄养。源代碼中相應的變化就比較簡單了:

#ifdef USE_SHOW

#include"show.h"

#endif

最后當然是編寫config.h.in文件

因為在前面的配置文件里面,用到了config.h银舱,里面預定義了USE_SHOW的值瘪匿,但是我們不需要直接去編寫它,更方便的辦法是寫一個config.h.in文件寻馏,從CMakeLists.txt中導入配置棋弥。

config.h.in文件里面寫下面一句:

#cmakedefine USE_SHOW


Linux下的使用

同理,如果做好了Linux的配置诚欠,也是一樣的顽染。

在項目目錄下面使用 cmake .,軟件會去確認當前默認的編譯工具聂薪,比如GNU 4.8.1

然后其他流程類似家乘,不過在Linux下面可以使用ccmake 或者 cmake -i 來打開交互式配置界面方便選擇。

方向鍵選擇不同選項藏澳,enter鍵進行修改仁锯,c鍵完成配置,g鍵確認生成makefile翔悠,其他的操作可以參考界面上的提示业崖。


正文就介紹到這里,如果需要進一步學習了解的蓄愁,參考資料整理如下:


安裝和測試及報錯分析

windows下(測試可用):CMake簡要教程

Linux下(沒有Kali環(huán)境進行測試):CMake入門實戰(zhàn)

報錯分析合集:CMake error合集



最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末双炕,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子撮抓,更是在濱河造成了極大的恐慌妇斤,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丹拯,死亡現場離奇詭異站超,居然都是意外死亡,警方通過查閱死者的電腦和手機乖酬,發(fā)現死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門死相,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咬像,你說我怎么就攤上這事算撮∩穑” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵肮柜,是天一觀的道長陷舅。 經常有香客問我,道長素挽,這世上最難降的妖魔是什么蔑赘? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任狸驳,我火速辦了婚禮预明,結果婚禮上,老公的妹妹穿的比我還像新娘耙箍。我一直安慰自己撰糠,他們只是感情好,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布辩昆。 她就那樣靜靜地躺著阅酪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪汁针。 梳的紋絲不亂的頭發(fā)上术辐,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音施无,去河邊找鬼辉词。 笑死,一個胖子當著我的面吹牛猾骡,可吹牛的內容都是我干的瑞躺。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼兴想,長吁一口氣:“原來是場噩夢啊……” “哼幢哨!你這毒婦竟也來了?” 一聲冷哼從身側響起嫂便,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤捞镰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后毙替,有當地人在樹林里發(fā)現了一具尸體岸售,經...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年蔚龙,在試婚紗的時候發(fā)現自己被綠了冰评。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡木羹,死狀恐怖甲雅,靈堂內的尸體忽然破棺而出解孙,到底是詐尸還是另有隱情,我是刑警寧澤抛人,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布弛姜,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜瘫镇,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一肚逸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧简卧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酷鸦。三九已至饰躲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臼隔,已是汗流浹背嘹裂。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摔握,地道東北人寄狼。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像盒发,于是被迫代替她去往敵國和親例嘱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內容