CMake 簡介與使用

2017.07.05

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

簡介

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

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

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

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

一些比較出名的開源項目以及商業項目,也都是采用CMake作為項目架構系統,比如KDE以及OpenCV,奈飛(Netflix),第二人生(Second Life),還有LLVM 和Clang,MySQL等等。

安裝

官網是https://cmake.org?


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


使用

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

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

例如先創建一個小程序:


然后在相同目錄下創建一個CMakeLists.txt文件

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

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

第三行是指定生成目標,也就是生成可以被開發環境使用的工程項目文件

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


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


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


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

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

aux_source_directory(<dir><variable>)


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


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

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

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


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

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


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

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

include_directories ("${PROJECT_SOURCE_DIR}/show")

進階

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

也是在頂層的CMakeLists添加

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

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

下面就繼續構建和鏈接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環境進行測試):CMake入門實戰

報錯分析合集:CMake error合集



最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容