從hello world開始,逐步學習cmake。本文主要講cmake的set和add_executable指令以及內部構建和外部構建
cmake是makefile的上層構建工具,它並不直接編譯構建整個工程,而是用於構建可移植的makefile或是 Windows 的 VS 工程文件,並簡化自己動手寫makefile時的巨大工作量。手動寫makefile往往依賴於當前編譯平臺,而且編寫makefile的工作量比較大,解決依賴往往會讓你頭皮發麻。因此,對於較大項目,應當考慮使用更自動化一些的 cmake或者autotools等工具來生成makefile,而不是上來就動手編寫。
目錄
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裏指定的,我們後面繼續學習