CMake實戰教程(一)

前言

在學習CMake之前,一直都是自己在手敲Makefile文件,當項目的文件一旦多了起來,自己手動寫Makefile就不是那麼好玩了,也曾經瞭解了一下autotools,但是seeed的柱哥說有CMake這個東西,所以我就去學習了,也在網上搜過對比,下面的一句話讓我放棄了autotools

CMake產生的晚,解決了很多autotools工具的問題

其實吧,簡單來說CMake就是生產Makefile的自動化構建工具,引用一句官方的描述就是:

CMake 是一個跨平臺的構建系統生成工具。它使用平臺無關的 CMake 清單文件CMakeLists.txt,指定工程的構建過程;源碼樹的每個路徑下都有這個文件。CMake 產生一個適用於具體平臺的構建系統,用戶使用這個系統構建自己的工程。

安裝CMake

  • 開發環境:Ubuntu

一句代碼的事安裝CMake

sudo apt-get install cmake

檢測安裝是否成功:

cmake --version 

# 輸出
cmake version 3.10.2
CMake suite maintained and supported by Kitware (kitware.com/cmake).

如果你用的是vscode寫代碼的話,最好還是裝一個CMake插件,更加方便:
cmake插件
關於其他的一些注意事項,你需要編譯c代碼,起碼Ubuntu得有個gcc編譯器啥的吧~如果沒有就直接安裝得了…

初步瞭解CMake

其實呢,CMake是非常簡單易用的,我們寫代碼無非就是將寫好的代碼進行編譯生成可執行文件,那麼就可以用CMake 生成 Makefile 文件並編譯源代碼!

它的流程基本如下:

  1. 編寫 CMake配置文件 CMakeLists.txt
  2. 執行cmake PATH命令生成 Makefile。其中, PATHCMakeLists.txt 所在的目錄。
  3. 使用 make 命令進行編譯。(既然步驟2的時候就生成Makefile文件了,那麼肯定是可以直接make編譯啦)

基本語法

一個最基本的CmakeLists.txt文件最少需要包含以下3行代碼:

# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)

# 項目信息
project (section1)

# 指定生成目標
add_executable(section1 main.c)

注意CMake的語法支持大寫、小寫甚至是大小寫混合的,實在是太變態了,不過呢,在傑傑的例程中使用的CMake語法是小寫的,全局變量是大寫的,局部變量是小寫!

section1

廢話不多說,直接入門實戰吧,寫代碼這東西還是要親自動手去寫採用意義~

  • 文件夾目錄結構如下:
jie@pc:~/github/cmake/section1$ tree
.
├── CMakeLists.txt
└── main.c

0 directories, 2 files

非常簡單,也就是一個main.c文件與一個CMakeLists.txt文件,內容更是簡單,main.c就只是打印個"Hello World!"

#include <stdio.h>

int main(void)
{
    printf("Hello World!\n");
    return 0;
}

CMakeLists.txt就是CMake最基礎的3行代碼:

# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)

# 項目信息
project (section1)

# 指定生成目標
add_executable(section1 main.c)

這樣子可以在該目錄下直接運行以下命令去編譯(注意有一個 .,表示CMakeLists.txt 所在的目錄):

cmake .

編譯輸出信息如下:

jie@pc:~/github/cmake/section1$ 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/jie/github/cmake/section1

然後你就會看到生成了一些其他文件文件以及一個Makefile文件:

jie@pc:~/github/cmake/section1$ ls
CMakeCache.txt  CMakeFiles  cmake_install.cmake  CMakeLists.txt  main.c  Makefile

既然有Makefile文件那麼就可以直接運行make命令去編譯源碼文件了,最後輸出“Built target section1”表示編譯成功!最終目錄下會多出一個section1可執行文件,然後你運行它就能看到代碼的執行效果了,直接打印輸出"Hello World!"

jie@pc:~/github/cmake/section1$ make
Scanning dependencies of target section1
[ 50%] Building C object CMakeFiles/section1.dir/main.c.o
[100%] Linking C executable section1
[100%] Built target section1

CMakeLists.txt分析

# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)

# 項目信息
project (section1)

# 指定生成目標
add_executable(section1 main.c)

其實上面的三句代碼看起來像是函數,但並不是函數而是命令,它跟我們的在linux的命令差不多,反正就是指定CMake要怎麼做的一系列命令。比如:

  • cmake_minimum_required:設置一個工程所需要的最低 CMake版本,如果 CMake的當前版本低於指定的版本,它會停止處理工程文件,並報告錯誤。
  • project:爲整個工程設置一個工程名。
  • add_executable:使用給定的源文件,爲工程引入一個可執行文件。
 add_executable(<name> [WIN32] [MACOSX_BUNDLE]
                [EXCLUDE_FROM_ALL]
                source1 [source2 ...])

引入一個名字爲<name>的可執行目標,這個可執行目標會由調用該命令時在源文件列表中指定的源文件來構建,比如main.c就是一個源碼文件。<name>在工程範圍內必須是全局唯一的,它實際上就是make編譯後生成的可執行文件。

順便再提一下語法,上面的代碼呢,<name>是必須填寫的,然後也必須有一個源碼文件source1,當然有可以有多個源碼文件[source2 ...]

格式 註釋
< command > 必須填寫的
[ command ] 可寫也可不寫的
a|b a或者b都可以

對了,# 後面的是註釋,這根C語言中//表示註釋是一樣的!

代碼下載

https://github.com/jiejieTop/cmake

暫且到這吧,未完待續…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章