cmake門口觀望篇-單文件編譯

    從hello world開始,逐步學習cmake。本文主要講cmake的set和add_executable指令以及內部構建和外部構建

cmake是makefile的上層構建工具,它並不直接編譯構建整個工程,而是用於構建可移植的makefile或是 Windows 的 VS 工程文件,並簡化自己動手寫makefile時的巨大工作量。手動寫makefile往往依賴於當前編譯平臺,而且編寫makefile的工作量比較大,解決依賴往往會讓你頭皮發麻。因此,對於較大項目,應當考慮使用更自動化一些的 cmake或者autotools等工具來生成makefile,而不是上來就動手編寫。


目錄

1 Hello CMake

2 說明與完善

3 構建文件與源文件分離--外部構建


1 Hello CMake

    從經典程序Hello wold開始

main.cpp

#include<stdio.h>
int main()
{
    printf("Hello CMake \n");
}

CmakeLists.txt

add_executable(camektest main.c)

    目錄結構

.
├── CMakeLists.txt
└── main.c

在代碼路徑下開始構建(內部構建),執行cmake ./  

cmake ./

等待片刻,在工程目錄下將生成編譯使用的MakeFile以及其他cmake配置文件

dawn@DAWN-AMD:~/workstation/cmaketest$ ls
CMakeCache.txt  CMakeFiles  CMakeLists.txt  Makefile  cmake_install.cmake  main.c

此時執行make即可編譯main.c

dawn@DAWN-AMD:~/workstation/cmaketest$ ls
CMakeCache.txt  CMakeFiles  CMakeLists.txt  Makefile cmake_install.cmake  cmaketest  main.c
dawn@DAWN-AMD:~/workstation/cmaketest$ ./camektest
Hello CMake

2 說明與完善

CMakeLists.txt是 cmake 的構建定義文件,文件名嚴格區分大小寫,大小寫不一致不生效,執行時會報錯The source directory xxx does not appea,如果工程存在多個目錄,需要確保每個要管理的目錄都存在一個CMakeLists.txt。(關於多目錄構建,後面繼續學習)。另外cmake語法不嚴格區分大小寫,即CMakeLists.txt文件內變量或指令不區分大小寫,可以大小寫混搭,add_executable(camektest main.c)寫成Add_ExecuTablE(camektest main.c)也是可以的, 當然,建議根據自己喜好使用統一風格

下面對add_executable指令進行說明,

基本語法

add_executable(hello ${src_list})

使用src_list中的源文件,生成可執行文件hello,所以採用變量形式,我們的例子可以寫成

set(src_list main.c)
add_executable(hello ${src_list})

set指令的語法 :

SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) 
指令功能: 用來顯式的定義變量                            
例子: set(src_list main.c other.c) 
說明: 用變量代替值,例子中定義src_list代替後面的字符串。

當然,一般cmake會在開頭加上如下內容

#設置cmake最低版本,構建環境低於設置版本時,執行cmake將報錯並終止構建
cmake_minimum_required(VERSION 3.6.0)
#指定項目名稱
project(Main)

3 構建文件與源文件分離--外部構建

上面的方法產生的構建文件直接生成在源文件目錄,兩者混在一起,不夠簡潔美觀,下面使用外部構建,將兩者分離開。

外部構建的方法也挺簡單的,執行cmake的時候我們需要添加一個參數,即需要構建的目錄,而生成的構建文件則放在執行cmake的當前目錄,那我們只需要單獨創建一個目錄,再cd到新建目錄執行cmake並指定需要構建的目錄即可讓源文件與構建文件分離,如下所示

dawn@DAWN-AMD:~/workstation/cmaketest$ tree
.
├── CMakeLists.txt
└── main.c
dawn@DAWN-AMD:~/workstation/cmaketest$ mkdir build && cd build
dawn@DAWN-AMD:~/workstation/cmaketest/build$ cmake ../
dawn@DAWN-AMD:~/workstation/cmaketest/build$ cd ..
dawn@DAWN-AMD:~/workstation/cmaketest$ tree -L 2
.
├── CMakeLists.txt
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── Makefile
│   └── cmake_install.cmake
└── main.c

這樣就可以讓編譯文件與源文件分隔開,不僅讓源文件目錄看起來整潔,而且想要恢復源文件直接刪掉build目錄就可以了,仔細觀察你會發現,無論是內部構建還是外部構建,默認構建生成的最終可執行文件都在執行cmake時所在目錄,當然這個是可以在CMakeLists.txt裏指定的,我們後面繼續學習

 

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