一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
--------------------------------------------