cmake實戰第一篇:初試 cmake


1.准備工作:

首先,在/code_test 目錄下建立一個 cmake 目錄,用來放置我們學習過程中的所有練習。(如果以下命令出現xxx: cannot create directory ‘x’: Permission denied錯誤則需要在命令前加上sudo,編譯時也是)
mkdir -p /code_test/cmake
以后我們所有的cmake練習都會放在/code_test/cmake 的子目錄下(你也可以自行安排目錄,這個並不是限制,僅僅是為了敘述的方便)然后在cmake目錄下建立第一個練習目錄p1
cd /code_test/cmake
mkdir p1
cd p1

在 p1 目錄建立 main.cpp 和 CMakeLists.txt(注意文件名大小寫)並用你所熟悉的文本編輯器加入以下內容:

//main.cpp

#include <iostream>

using namespace std;

int main() { cout<<"Hello World !"<<endl;return 0; }

//CmakeLists.txt 文件內容:

PROJECT (HELLO)
SET(SRC_LIST main.cpp)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})

CMakeLists.txt是cmake的構建定義文件,注意文件名是大小寫相關的,如果工程存在多個目錄,需要確保每個要管理的目錄都存在一個CMakeLists.txt。目的是生成Makefile文件,其實也可以直接編寫makefile,但是大工程比較復雜,所以用CmakeLists.txt目的就是自動生成Makefile。

下面分析語法:

PROJECT指令的語法是

PROJECT(projectname [CXX] [C] [Java])
這個指令定義工程名稱,並可指定工程支持的語言,默認情況表示支持所有語言。非常重要的是這個指令隱式的定義了兩個cmake變量: <projectname>_BINARY_DIR 以及<projectname>_SOURCE_DIR 這里就是HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR (所以CMakeLists.txt中兩 MESSAGE指令可以直接使用了這兩個變量),如果采用的是內部編譯,兩個變量目前指的都是工程所在路徑/code_test/cmake/p1,后面我們會講到外部編譯,兩者所指代的內容會有所不同。為了統一起見,建議以后直接使用 PROJECT_BINARY_DIR  PROJECT_SOURCE_DIR,好處是即使修改了工程名稱,也不會影響這兩個變量。如果使用了<projectname>_SOURCE_DIR,修改工程名稱后,需要同時修改這些變量。
 

SET指令的語法是

SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
SET指令可以用來顯式的定義變量,比如我們用到的SET(SRC_LIST main.cpp), 也就是將man.cpp賦給SRC_LIST變量,以后SRC_LIST就是指man.cpp可以理解為c++里的別名引用,如果有多個源文件,也可以定義成:SET(SRC_LIST main.cpp x1.cpp x2.cpp)還有一點雖不常用但得注意SET(SRC_LIST main.cpp)也可以寫成 SET(SRC_LIST “main.cpp”)是沒有區別的,但是假設一個源文件的文件名是 fu nc.cpp(文件名中間包含了空格)。這時候就必須使用雙引號,如果寫成了 SET(SRC_LIST fu nc.cpp),就會出現錯誤,提示你找不到 fu 文件和 nc.cpp 文件。
 

MESSAGE 指令的語法是:

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
這個指令主要用來調試用,用於向終端輸出用戶定義的信息,包含了三種類型:
SEND_ERROR,產生錯誤,生成過程被跳過。
SATUS,輸出信息。
FATAL_ERROR,立即終止所有 cmake 過程。
我們在這里使用的是 STATUS 信息輸出,顯示的效果是: 
This is BINARY dir /code_test/cmake/p1
This is SOURCE dir /code_test/cmake/p1
 
ADD_EXECUTABLE(hello ${SRC_LIST})
定義了這個工程會生成一個文件名為hello的可執行文件(自己隨便起名字),相關的源文件是SRC_LIST中定義的源文件列表,本例中你也可以直接寫成 ADD_EXECUTABLE(hello main.cpp)。變量使用${}方式取值,這是cmake的變量應用方式,但是,有一些例外,在IF控制語句中是直接使用變量名引用,而不需要${}。
 
注意:1.參數使用括弧括起,參數之間使用空格或分號分開。2.指令是大小寫無關的,參數和變量是大小寫相關的。但推薦全部使用大寫指令。
2.開始構建:構建分為內部構建(in-sourcebuild)和外部構建(out-of-source build),外部構建一個最大的好處是,對於原有的工程沒有任何影響,所有動作全部發生在編譯目錄。而cmake強烈推薦的是外部構建。

內部構建:

這在個目錄下輸入命令:
cmake .  //注意命令后面的點號,代表本目錄

輸出大概是這個樣子:

 

你會發現,目錄中系統自動生成了:

CMakeFiles, CMakeCache.txt, cmake_install.cmake 等文件,並且生成了Makefile.最關鍵的是它自動生成Makefile其他的不用理,make主要去找Makefile,make是一個命令工具,是一個解釋makefile中指令的命令工具,其實也可以直接編寫makefile,但是大工程比較復雜,所以用CmakeLists.txt目的就是自動生成Makefile。
然后進行工程的實際構建,在這個目錄輸入命令:
 
make 

輸出大概是這個樣子:

 

如果你需要看到 make 構建的詳細過程,可以使用 make VERBOSE=1 或者 VERBOSE=1命令來進行構建。
我們需要的目標文件 hello 已經構建完成,位於當前目錄,嘗試運行一下:
./hello

得到輸出:

Hello World !

外部編譯:

1.首先,請清除p1目錄中除main.c CmakeLists.txt之外的所有中間文件,最關鍵的是CMakeCache.txt。
2.在p1目錄中建立build目錄,當然你也可以在任何地方建立build目錄,不一定必須在工程目錄中。
mkdir build

 

3.進入build目錄,運行cmake ..(: .. 代表父目錄,因為父目錄存在我們需要的CMakeLists.txt,如果你在其他地方建立了build目錄,需要運行cmake<工程的全路徑>找到CMakeLists.txt),查看一下build目錄,就會發現了生成了編譯需要的Makefile以及其他的中間文件。
cd build
cmake ..

 

4.運行make構建工程,就會在當前目錄(build目錄)中獲得目標文件hello 
make

 

讓我們的代碼更像個工程:

 http://www.cnblogs.com/zjiaxing/p/5557648.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM