CMake入門(一)

Written with StackEdit.

CMake是什么

CMake是一個(gè)opensource的軟件項(xiàng)目構(gòu)建管理工具采转;它允許開(kāi)發(fā)者用一種簡(jiǎn)單的文本格式進(jìn)行構(gòu)建參數(shù)的指定聪廉。

為什么使用CMake

如果你之前有過(guò)維護(hù)軟件包的構(gòu)建和安裝的經(jīng)驗(yàn),你就會(huì)對(duì)CMake有興趣氏义。
當(dāng)前很多項(xiàng)目都可以在Linux下用Makefile和在Windows下用Visual Studio進(jìn)行編譯锄列;這要求開(kāi)發(fā)者在對(duì)應(yīng)的系統(tǒng)下保持構(gòu)建工具的更新,并且不同系統(tǒng)的構(gòu)建行為保持一致惯悠;如果再引入XCode,這需要更多的構(gòu)建工具竣况,這樣會(huì)是一個(gè)問(wèn)題克婶。
如果在此基礎(chǔ)上引入可選組件,比如如果系統(tǒng)上有l(wèi)ibjpeg丹泉,項(xiàng)目就支援JPEG情萤,這會(huì)造成更大的麻煩。
CMake提供了一個(gè)簡(jiǎn)單的摹恨,易于理解的文件格式來(lái)解決上述問(wèn)題筋岛。

如果一個(gè)項(xiàng)目有多個(gè)開(kāi)發(fā)者參與,或者這個(gè)項(xiàng)目有多個(gè)目標(biāo)平臺(tái)晒哄;那么不可避免的需要在多臺(tái)PC上進(jìn)行構(gòu)建睁宰,不同的PC在開(kāi)發(fā)環(huán)境上會(huì)有差異肪获。

  • 自動(dòng)進(jìn)行項(xiàng)目構(gòu)建所需的program、library柒傻、header file的查找能力孝赫;
  • 在source tree以外進(jìn)行構(gòu)建的能力;
  • 為Qt moc红符,SWIG等自動(dòng)產(chǎn)生復(fù)雜的自定義命令的能力青柄;
  • 在configuration階段進(jìn)行可選組件定制的能力;
  • 自動(dòng)從簡(jiǎn)單文件文件產(chǎn)生workspace和project的能力预侯;
  • 配置生成靜態(tài)庫(kù)/動(dòng)態(tài)庫(kù)的能力致开;
  • 自動(dòng)產(chǎn)生文件依賴,支持并行編譯萎馅;

CMake的基本語(yǔ)法

build的過(guò)程由每個(gè)目錄下的名為CMakeFileLists.txt的文件組成的一系列文件列表所控制双戳;
CMakeFileLists.txt文件由CMake語(yǔ)句進(jìn)行項(xiàng)目描述,CMake語(yǔ)句的語(yǔ)法為:

command( args... )
  • command是命令的名字校坑,CMake是不區(qū)分大小寫(xiě)的拣技;
  • args是一系列由空格分隔的參數(shù),如果參數(shù)中有空格耍目,參數(shù)需要用雙引號(hào)引起來(lái)膏斤;

變量被引用的格式是${VAR};
多個(gè)參數(shù)可以使用set來(lái)使之構(gòu)成一個(gè)list

set( Foo a b c )

這樣設(shè)置的結(jié)果是Foo的值是 a b c;

CMake可以直接訪問(wèn)系統(tǒng)環(huán)境變量和Windows注冊(cè)表;
訪問(wèn)系統(tǒng)環(huán)境變量的語(yǔ)法:

$Env{ARG}

訪問(wèn)Windows注冊(cè)表:

[HKEY_CURRENT_USER\\Software\\path1\\path2;key]

Hello World

一個(gè)簡(jiǎn)單的CMakeFileLists.txt的例子

project( Hello )
add_executalbe( Hello Hello.c )

一個(gè)稍微復(fù)雜的例子

cmake_minimum_required( 2.6 )
project( HELLO )

set( HELLO_SRCS Hello.c File2.c File3.c )
if( WIN32 )
    set( HELLO_SRCS ${HELLO_SRCS} WinSupport.c )
esle()
    set( HELLO_SRCS ${HELLO_SRCS} LinuxSupport.c )
endif()

add_executable( HELLO ${HELLO_SRCS} )

# look for the Tcl library
find_library( TCL_LIBRARY 
    NAMES tcl tcl84 tcl83 tcl82 tcl80
    PATHS /usr/lib /usr/local/lib
    )
if( TCL_LIBRARY )
    target_link_library( Hello ${TCL_LIBRARY} )
endif()

如何運(yùn)行CMake

通常使用兩種方式運(yùn)行CMake

cmake-gui
通過(guò)桌面或者命令行運(yùn)行cmake-gui邪驮,打開(kāi)后UI如下:

cmake-gui

按照如下步驟進(jìn)行設(shè)置:

  1. 圖示1莫辨, 選擇source code所在位置(如果通過(guò)cmake-gui path_to_src的方式,source code位置已經(jīng)設(shè)定好);
  2. 圖示2毅访, 選擇build要產(chǎn)生文件的存放位置沮榜;
  3. 圖示3,configure喻粹;如果是第一次執(zhí)行configure蟆融,會(huì)彈出對(duì)話框讓進(jìn)行compiler的選擇,指定toolchain file守呜;這樣設(shè)置以后型酥,configure過(guò)程會(huì)進(jìn)行,在圖示4的區(qū)域顯示相關(guān)option查乒;
  4. 圖示4弥喉,進(jìn)行相關(guān)參數(shù)或者option的設(shè)置;
  5. 圖示5玛迄,generate由境,產(chǎn)生指定平臺(tái)的build file(Linux的Makefile或者Visual Studio的sln file);

命令行使用cmake

  1. 切換到準(zhǔn)備放置binary file的目錄
  2. cmake path_to_src -Doption
  3. make
  4. make install
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蓖议,一起剝皮案震驚了整個(gè)濱河市虏杰,隨后出現(xiàn)的幾起案子讥蟆,更是在濱河造成了極大的恐慌,老刑警劉巖嘹屯,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攻询,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡州弟,警方通過(guò)查閱死者的電腦和手機(jī)钧栖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)婆翔,“玉大人拯杠,你說(shuō)我怎么就攤上這事】信” “怎么了潭陪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)最蕾。 經(jīng)常有香客問(wèn)我依溯,道長(zhǎng),這世上最難降的妖魔是什么瘟则? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任黎炉,我火速辦了婚禮,結(jié)果婚禮上醋拧,老公的妹妹穿的比我還像新娘慷嗜。我一直安慰自己,他們只是感情好丹壕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布庆械。 她就那樣靜靜地躺著拭宁,像睡著了一般蹬挺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上邑茄,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天琉用,我揣著相機(jī)與錄音忿峻,去河邊找鬼。 笑死辕羽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垄惧。 我是一名探鬼主播刁愿,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼到逊!你這毒婦竟也來(lái)了铣口?” 一聲冷哼從身側(cè)響起滤钱,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脑题,沒(méi)想到半個(gè)月后件缸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叔遂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年他炊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片已艰。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡痊末,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哩掺,到底是詐尸還是另有隱情凿叠,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布嚼吞,位于F島的核電站盒件,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舱禽。R本人自食惡果不足惜炒刁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呢蔫。 院中可真熱鬧切心,春花似錦、人聲如沸片吊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)俏脊。三九已至全谤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爷贫,已是汗流浹背认然。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漫萄,地道東北人卷员。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像腾务,于是被迫代替她去往敵國(guó)和親毕骡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • CMake學(xué)習(xí) 本篇分享一下有關(guān)CMake的一些學(xué)習(xí)心得以及相關(guān)使用。 本文目錄如下: [1未巫、CMake介紹] [...
    AlphaGL閱讀 12,226評(píng)論 11 79
  • 注:首發(fā)地址 1. 前言 當(dāng)在做 Android NDK 開(kāi)發(fā)時(shí)窿撬,如果不熟悉用 CMake 來(lái)構(gòu)建,讀不懂 CMa...
    cfanr閱讀 24,303評(píng)論 1 53
  • 【MySQL】Linux下MySQL 5.5跛璧、5.6和5.7的RPM、二進(jìn)制和源碼安裝 1.1BLOG文檔結(jié)構(gòu)圖 ...
    小麥苗DB寶閱讀 10,519評(píng)論 0 31
  • 喝酒饼拍,你喜歡什么樣的感覺(jué)赡模,說(shuō)句實(shí)話,我喜歡爛醉的感覺(jué)师抄。 我覺(jué)得喝酒要盡興而且要和合適的人一起喝漓柑,這樣的酒才算是喝對(duì)...
    莊德坤閱讀 343評(píng)論 0 0
  • 我,一個(gè)平凡單純的姑娘叨吮,一個(gè)理想主義者辆布。幻想著美好的愛(ài)情茶鉴,幻想著城堡锋玲,王子。我渴望得到一份天長(zhǎng)地久的愛(ài)情涵叮,我只想一...
    42ece776fb92閱讀 189評(píng)論 0 1