最近找了一個《cmake practice》的電子書,以爲寫得比較清晰易懂,適合我這種noob,本隨筆主要內容基於該電子書,所以會出現「過渡引用」的問題,主要目的是做爲本身的學習筆記。git
另外英語比較好的能夠直接去看Github,地址是https://github.com/Akagi201/learning-cmakegithub
我的以爲,寫cmake自己的技術要求,同掌握一門腳本語言至關,某種程度上可能難度還高一些。bash
廢話少說,開始學習。學習
初識和安裝就算了,這都解決不了那就無法玩了。測試
直接從基本編譯文件開始。ui
先在主目錄下建立一個測試的目錄,例如個人主目錄是/home/castor/,那就搞一個mycmake的文件夾,再搞一個t1的文件夾。spa
~$cd ~$mkdir -p mycmake/t1
接下來就是在這個文件夾下面建立兩個文件了:3d
~$ cd mycmake/t1/ castor@xdvm:~/mycmake/t1$ touch main.c castor@xdvm:~/mycmake/t1$ touch CMakeLists.txt
而後main.c中是經典的helloworld代碼,或者其餘,這裏直接複製文檔中的代碼:blog
#include <stdio.h> int main() { printf("Hello World from t1 Main!\n"); return 0; }
固然這個不是重點,看看CMakeLists.txt中怎麼寫:文檔
PROJECT (HELLO) SET(SRC_LIST main.c) MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR}) MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR}) ADD_EXECUTABLE(hello ${SRC_LIST})
原文檔第六頁的代碼有bug,最後一行SRC_LIST沒有被$和花括號包起來。
構建和運行很簡單:
~/mycmake/t1$ cmake . ~/mycmake/t1$ make
執行後大概是這樣的:
而後就能夠經過./hello運行程序了。
解釋一下:cmake .(注意後面的小句點),這個命令生成了不少文件,目前須要知道的是,以及重點是,生成了Makefile文件。而後make就是按這個Makefile生成可執行文件。
最重點的仍是CMakeLists文件了。
PROJECT定義了工程的名字
cmake 系統也幫助咱們預約義了 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR變量,他們的值分別跟 HELLO_BINARY_DIR 與 HELLO_SOURCE_DIR(這兩個是隱式變量) 一致,若是項目名字變化,PROJECT_BINARY_DIR 和PROJECT_SOURCE_DIR可以自適應。
SET 指令的語法是:
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
現階段,你只須要了解 SET 指令能夠用來顯式的定義變量便可。
好比咱們用到的是 SET(SRC_LIST main.c),若是有多個源文件,也能夠定義成:
SET(SRC_LIST main.c t1.c t2.c)。
MESSAGE 指令的語法是:
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)
這個指令用於向終端輸出用戶定義的信息,包含了三種類型:
SEND_ERROR,產生錯誤,生成過程被跳過。
SATUS,輸出前綴爲--的信息,圖中能夠看到。
FATAL_ERROR,當即終止全部 cmake 過程。
若是不加這三種也是能夠的,那就是一個普通的信息,有點相似echo了。
ADD_EXECUTABLE(hello ${SRC_LIST})
定義了這個工程會生成一個文件名爲 hello 的可執行文件 ,這個SRC_LIST就是前面定義的一個變量。
雖然這裏看起來有點畫蛇添足,可是若是屢次出現的多個文件的話,就會發現這種方式很方便。
cmake中使用了${}來引用變量,這是 cmake 的變量引用方式,可是,有一些例外,好比在 IF 控制語句,變量是直接使用變量名引用,而不須要${},這個要當心。
基本語法規則
1. 變量使用${}方式取值,可是在 IF 控制語句中是直接使用變量名
2. 指令(參數 1 參數 2...) 參數使用括弧括起,參數之間使用空格或分號分開
3. 指令是大小寫無關的,參數和變量是大小寫相關的。 推薦所有使用大寫指令
4. 後面學習到了再加上
使用make clean 命令清除構建(感受用處不大)
剛纔進行的是內部構建(in-source build),而 cmake 強烈推薦的是外部構建(out-of-source build)
外部編譯的過程以下:
1,首先,請清除 t1 目錄中除 main.c CmakeLists.txt 以外的全部中間文件,最關鍵的是 CMakeCache.txt。
2,在 t1 目錄中創建 build 目錄,固然你也能夠在任何地方創建 build 目錄,不必定必須在工程目錄中。
3,進入 build 目錄,運行 cmake ..(注意,..表明父目錄,由於父目錄存在咱們須要的CMakeLists.txt,若是你在其餘地方創建了 build 目錄,須要運行 cmake <工程的全路徑>),查看一下 build 目錄,就會發現了生成了編譯須要的 Makefile 以及其餘的中間
文件.
4,運行 make 構建工程,就會在當前目錄(build 目錄)中得到目標文件 hello。
上述過程就是所謂的 out-of-source 外部編譯,一個最大的好處是,對於原有的工程沒有任何影響,全部動做所有發生在編譯目錄。
使用外部構建之後,能夠看到:
-- This is BINARY dir /home/castor/mycmake/t1/build
-- This is SOURCE dir /home/castor/mycmake/t1
binary和source在不一樣的目錄了