【CMake系列】(一)入門

自從上次在爲什麼 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++ 項目就完成了。

其它

一個簡單的例子完成了,可是該如何添加第三方依賴?怎麼添加編譯選項?怎麼測試?怎麼添加文檔?

不急,以後我會慢慢道來,爭取寫一個比較長的系列。

Ref

  1. http://www.cmake.org/

感謝閱讀,本文首發於 Github issues: https://github.com/xizhibei/b... (Star 以及 Watch 強烈暗示 :P);另外這篇文章也能在本人博客內閱讀:https://blog.xizhibei.me/2020...

本文采用 署名-非商業性使用-相同方式共享(BY-NC-SA)進行許可。

相關文章
相關標籤/搜索