1. 程式人生 > >單個源文件下CmakeList.txt

單個源文件下CmakeList.txt

使用 print cmake cut 但是 ${} 三種 tdi mat

單個源文件下CmakeList.txt

1. main.c代碼 & CmakeLists.txt 文件內容

在任意自己選定的目錄下(t1/)編寫main.c 與 CmakeLists.txt
main.c 文件內容:

//main.c
#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})

2. 編譯與運行

現在\(t1/\)目錄下存在兩個文件即main.c 與 CmakeLists.txt。
下面構建這個工程
終端執行命令:

$mkdir build
$cd build
$cmake ..
$make

這裏采用cmake的 out-of-source 方式來構建
運行可執行文件:

./hello

//輸出為
//Hello World from t1 Main!`

3. CMakeLists.txt 中指令解釋 

PROJECT(projectname [CXX] [C] [Java])

這個指令用來定義工程名稱,並可指定工程支持的語言,支持的語言列表是可以忽略的,默認情況表示支持所有語言。

這個指令隱式的定義了兩個 cmake 變量 :[projectname]_BINARY_DIR 以及[projectname]_SOURCE_DIR 。
[projectname]_BINARY_DIR表示編譯發生的目錄,[projectname]_SOURCE_DIR表示工程所在目錄。
這裏就是 HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR( 所以 CMakeLists.txt 中兩個 MESSAGE 指令可以直接使用了這兩個變量 ) 。
同時 cmake 系統也幫助我們預定義了 PROJECT_BINARY_DIR 和PROJECT_SOURCE_DIR 變量,他們的值分別跟HELLO_BINARY_DIR 與HELLO_SOURCE_DIR 一致。

因為采用的是 out-of-source 方式來構建,
t1_BINARY_DIR 變量目前指的都是工程所在路徑 t1/build。
t1_SOURCE_DIR變量目前指的都是工程所在路徑 t1 。

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)
這個指令用於向終端輸出用戶定義的信息,包含了三種類型 :

  • SEND_ERROR--------產生錯誤,生成過程被跳過。
  • SATUS--------輸出前綴為—的信息。
  • FATAL_ERROR --------立即終止所有 cmake 過程 。

ADD_EXECUTABLE(hello ${SRC_LIST})
定義了這個工程會生成一個文件名為 hello 的可執行文件, 相關的源文件是 SRC_LIST 中定義的源文件列表, 本例中你也可以直接寫成 ADD_EXECUTABLE(hello main.c) 。
在本例我們使用了${} 來引用變量,這是 cmake 的變量應用方式。但是,有一些例外,比如在 IF 控制語句,變量是直接使用變量名引用,而不需要${} 。如果使用了${} 去應用變量,其實 IF 會去判斷名為${} 所代表的值的變量,那當然是不存在的了。
將本例改寫成一個最簡化的 CMakeLists.txt如下:

///CMakeLists.txt 
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(HELLO)
ADD_EXECUTABLE(hello main.c)

單個源文件下CmakeList.txt