cmake是什么,為什么現(xiàn)在都用cmake,cmake編譯原理和跨平臺示例

一cmake是什么导而?

CMake是一個開源忱叭、跨平臺的工具系列隔崎,是用來構(gòu)建、測試和打包軟件韵丑。

CMake使用平臺無關(guān)的配置文件來控制軟件編譯過程爵卒,并生成可在您選擇的編譯器環(huán)境中使用項目文件,比如可以生成vs項目文件或者makefile撵彻。CMake工具套件由Kitware公司創(chuàng)建钓株,以滿足ITK和VTK等開源項目對跨平臺構(gòu)建環(huán)境的需求。Kitware是一家從事醫(yī)療計算千康,高性能的可視化和計算享幽,數(shù)據(jù)和分析,計算機視覺的公司拾弃。該公司成立于1998年。

二為什么現(xiàn)在都用cmake摆霉?

1 為什么用cmake豪椿,這里有兩個問題,首先要問為什么我需要一個好的構(gòu)建系統(tǒng)携栋?搭盾,下面是主要的原因:

你想避免硬編碼路徑

您需要在多臺計算機上構(gòu)建一個包

你需要支持不同的操作系統(tǒng)

你想支持多個編譯器

您想使用IDE,但不是所有情況

你想描述你的程序的邏輯結(jié)構(gòu)婉支,而不是標(biāo)志和命令

你想使用庫

您想使用其他工具來幫助您編寫代碼moc ProtoBuf

你想使用單元測試

2 這里有個重要的需求鸯隅,就是持續(xù)集成,下面我們來說明一下什么是持續(xù)集成,

每次集成都通過自動化的制造(包括提交向挖、發(fā)布蝌以、自動化測試)來驗證,準(zhǔn)確地發(fā)現(xiàn)集成錯誤何之。

快速錯誤跟畅,每完成一點更新,就集成到主干溶推,可以快速發(fā)現(xiàn)錯誤徊件,定位錯誤也比較容易

各種不同的更新主干,如果不經(jīng)常集成蒜危,會導(dǎo)致集成的成本變大

讓產(chǎn)品可以快速地通過虱痕,同時保持關(guān)鍵測試合格

自動化測試,只要有一個測試用例不通過就不能集成

集成并不能刪除發(fā)現(xiàn)的錯誤辐赞,而是讓它們很容易發(fā)現(xiàn)和改正

3 那又為什么是cmake部翘?下面我們看下cmake的特性就知道為什么要選擇它了:

cmake特性

自動搜索可能需要的程序、庫和頭文件的能力

獨立的構(gòu)建目錄占拍,可以安全清理

創(chuàng)建復(fù)雜的自定義命令略就,例如qt moc uic

配置時選擇可選組件的能力

從簡單的文本文件(CMakeLists.txt)自動生成工作區(qū)和項目的能力

在靜態(tài)和共享構(gòu)建之間輕松切換的能力

在大多數(shù)平臺上自動生成文件依賴項并支持并行構(gòu)建

下面再說兩個現(xiàn)實場景的原因:

幾乎每個IDE 都支持 CMake( CMake 支持幾乎所有IDE)

使用CMake 的軟件包比任何其他構(gòu)建系統(tǒng)都多

三cmake編譯原理 (cmake工作原理)


上面是我畫的cmake原理流程圖捎迫,有些復(fù)雜但基本描述了cmake的工作原理,更多內(nèi)容可以看下cmake的官方手冊 cmake.org.cn

四cmake編譯(Linux Windows MacOS系統(tǒng)構(gòu)建示例)

1 環(huán)境準(zhǔn)備

參考我的上一篇文章

《cmake使用方法詳解 - Windows Linux MacOS cmake安裝教程》

2 源碼準(zhǔn)備

源碼準(zhǔn)備表牢,三個平臺使用同一份c++源碼和cmake配置

c++源碼

//first_cmake.cpp

?#include <iostream> using?

namespace std; int main(int argc,char *argv[])

?{?

? cout<<"first cmake c++"<<endl;

? ?eturn 0;?

}

CMake配置源碼 CMakeLists.txt

cmake_minimum_required 指定最低的cmake版本

project 項目名稱窄绒,后面可以通過變量獲取此名稱

# CMakeLists.txt?

cmake_minimum_required (VERSION 3.0)?

project (first_cmake)?

add_executable(first_cmake first_cmake.cpp)

目錄結(jié)構(gòu)

CMakeLists.txt文件在根目錄 ,c++源碼first_cmake.cpp和其同一個目錄崔兴。


2 Windows平臺編譯

編譯環(huán)境準(zhǔn)備參考的上一篇文章

CMake=》vs項目=》cl編譯

1 源碼目錄下面創(chuàng)建一個編譯目錄build彰导,用于生成cmake的臨時文件和項目文件,放在獨立的目錄方便清理和查看敲茄。


2 進入編譯目錄build位谋,直接運行cmake .. 使用默認生成項目文件,下圖生成的是vs2022的64位項目(文件所在的路徑和目錄層次不能太深堰燎,太深會找不到編譯器)掏父。 ?



3 編譯項目

有兩種編譯方法,第一種直接進入build目錄打開vs解決方案進行編譯.第二種秆剪,控制臺進入生成的項目文件路徑 build赊淑,然后運行 cmake --build . 后面的點表示當(dāng)前路徑。


3?Linux平臺編譯

1 安裝好gcc編譯工具

sudo apt install g++

sudo apt install make

CMake=》makefile=》make使用gcc或者clang編譯

可以手動創(chuàng)建build路徑仅讽,然后與上面的windows編譯方法一致陶缺。

還有一種方法

1 在CMakeLists.txt文件所在路徑,運行

cmake -S . -B build

-S 后面是指定CMakeLists.txt文件的路徑洁灵,-B后面是生成的編譯臨時目錄路徑饱岸。

使用默認生成項目文件,下圖生成的是makefile + gcc (linux下 c++ 指向g++ ,cc指向gcc)


2 編譯項目

編譯項目也有兩種方法徽千,

一種是直接使用生成的makefile文件

進入build目錄輸入 make 編譯項目苫费。

另一種是與windows編譯方法一致,在項目根路徑可以輸入

cmake --build build

后面的build是cmake生成的文件所在路徑

4?Mac平臺編譯

MacOS下的編譯罐栈,基本與linux下一致黍衙,當(dāng)然也可以選擇生成為xcode的工程項目


sudo xcode-select --switch /Applications/Xcode.app/


cmake .. -G "Xcode"

cmake --build .




更多內(nèi)容可以參考CMake官方手冊 cmake.org.cn

--------------------------------------------

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市荠诬,隨后出現(xiàn)的幾起案子琅翻,更是在濱河造成了極大的恐慌,老刑警劉巖柑贞,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件方椎,死亡現(xiàn)場離奇詭異,居然都是意外死亡钧嘶,警方通過查閱死者的電腦和手機棠众,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闸拿,你說我怎么就攤上這事空盼。” “怎么了新荤?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵揽趾,是天一觀的道長。 經(jīng)常有香客問我苛骨,道長篱瞎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任痒芝,我火速辦了婚禮俐筋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘严衬。我一直安慰自己澄者,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布瞳步。 她就那樣靜靜地躺著闷哆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪单起。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天劣坊,我揣著相機與錄音嘀倒,去河邊找鬼。 笑死局冰,一個胖子當(dāng)著我的面吹牛测蘑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播康二,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼碳胳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沫勿?” 一聲冷哼從身側(cè)響起挨约,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎产雹,沒想到半個月后诫惭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡蔓挖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年夕土,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘟判。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡怨绣,死狀恐怖角溃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情篮撑,我是刑警寧澤减细,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站咽扇,受9級特大地震影響邪财,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜质欲,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一树埠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嘶伟,春花似錦怎憋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熬词。三九已至洁墙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铃慷,已是汗流浹背蹋笼。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工展姐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剖毯。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓圾笨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親逊谋。 傳聞我的和親對象是個殘疾皇子擂达,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

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