自從上次在爲什麼 C++ 靜態連接庫順序很重要撿回了 C++,自此開始了不歸路。c++
今天咱們來講說,CMake 這個現代 C++ 項目的利器。git
爲何咱們須要 CMake ? 對於 C++ 開發者來講,他們會習慣於使用 GNU Make 來編譯 C++ 項目,對於簡單項目來講,這無可厚非,再加上有那麼多的開源工具可用,尤爲是 autotools 系列,用起來仍是挺方便的。目前仍有很是多的 C++ 項目,須要你先使用 ./configure
來預處理,而後再進行編譯,這比只用 Make 來講,方便不少倍,也就是對初學者很是友好 (高階用戶在此就不說了,畢竟如能把 Vim 用到飛起的高手並很少)。github
在我我的看來,autotools 系列不那麼簡潔(當我看見當前目錄生成一堆臨時文件的時候,會很是討厭,相對的,CMake 能夠有專門的編譯目錄真是拯救了個人強迫症),因爲沒有怎麼使用過,不便於說出更多其它意見,也沒法細緻對比。有興趣的也能夠看看 What are the differences between Autotools, Cmake and Scons? 上的討論。編程
從入手難度來講,CMake 是初學者的福音,不過有點麻煩的是,你須要學習一門新的語言,只是相對於編程語言來講,它仍是很是簡單的。bash
大多數狀況下,你只須要直接安裝便可,好比下面三個命令你能夠按照本身的機器選擇:編程語言
brew install cmake sudo apt install cmake pip install cmake
其它的方式就能夠直接在官網去下載後安裝。ide
讓咱們從一個最簡單的項目開始。工具
// main.cpp #include <stdio.h> int main(int argc, char *argv[]) { printf("Hello world"); return 0; }
咱們就能夠在當前目錄下建立一個 CMakeLists.txt:學習
# CMake 最低版本號要求,你也能夠設置版本範圍,好比 3.1...3.15 cmake_minimum_required (VERSION 3.0) # 項目信息,可設置版本號以及描述 project (demo VERSION 0.1.0 DESCRIPTION "Demo project") # 生成一個 demo 的可執行文件 add_executable(demo main.cpp)
而後,執行經典的四條命令,就能夠編譯出可執行文件了:測試
mkdir build cd build cmake .. make
不一樣於 Make,CMake 能夠將配置的過程大大簡化,三行語句,你就能夠寫出強大的跨平臺編譯腳本了,你能夠從輸出看到,一系列的步驟,都自動化完成了:
-- The C compiler identification is GNU 7.4.0 -- The CXX compiler identification is GNU 7.4.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: /home/xizhibei/demo/build
是不很簡單?再來個複雜點的例子。
如今,隨着你加入了更多的功能,你會須要改下你的 CMakeLists.txt。
好比你如今的項目結構是這樣的:
--- root |-- CMakeLists.txt |-- main.cpp |-- include/ |------ a.h |------ b.h |-- lib/ |------ a.cpp |------ b.cpp
那麼,對應着的修改以下:
cmake_minimum_required (VERSION 3.0) project (demo VERSION 0.1.0 DESCRIPTION "Demo project") # 添加 demo_lib 靜態庫 add_libary(demo_lib STATIC lib/a.cpp lib/b.cpp) # 指定頭文件所在位置 target_include_directories(demo_lib PUBLIC ${CMAKE_SOURCE_DIR}/include} # 同上 add_executable(demo main.cpp) # 這裏不須要再次 target_include_directories 了,由於咱們在設置了 include 是 demo_lib 須要的,CMake 會自動添加 # 將 demo_lib 庫連接至 demo 執行文件 target_link_libraries(demo demo_lib)
其實按照標準一些的方式,咱們應該在 lib 下建立一個新的 CMakeLists.txt,而後經過 add_subdirectory(lib)
來作,這裏這樣作是爲了節約篇幅。
因而,一個簡單的 C++ 項目就完成了。
一個簡單的例子完成了,可是該如何添加第三方依賴?怎麼添加編譯選項?怎麼測試?怎麼添加文檔?
不急,以後我會慢慢道來,爭取寫一個比較長的系列。
感謝閱讀,本文首發於 Github issues: https://github.com/xizhibei/b... (Star 以及 Watch 強烈暗示 :P);另外這篇文章也能在本人博客內閱讀:https://blog.xizhibei.me/2020... 。
本文采用 署名-非商業性使用-相同方式共享(BY-NC-SA)進行許可。