1. 程式人生 > >CMake入門教程(一)

CMake入門教程(一)

之前的一篇部落格介紹了CMake一些簡單的基礎情況:CMake的簡介、安裝以及基本的使用

現在一起來學習一下CMakeLists的基礎命令。

※※※※※※※※※※※※※※※※※※※※※※CMake的基本使用語法※※※※※※※※※※※※※※※※※※※※※※※※※※※

①CMake使用${}來獲取值,但是在IF語句裡面可以直接使用變數名

②環境變數使用$ENV{}來獲取,設定環境變數還用:set({ENV{VAR} VALUE)來設定

③指令(引數1 引數2):引數與引數中間使用空格分開

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

首先我們需要一個的工程,作為我們需要移植或者重新生成的工程。

情況一:只有單個目錄,單個原始檔的工程,假設我們把這個檔案叫做:Source.cpp

首次我們來編寫我們的CMakeLists.txt檔案

#CMake要求的最低點版本
cmake_minimum_requried(version 2.8)

#專案資訊
project (Demo1)

#指定生成的目標
add_executable(Dmeo Source.cpp)                

上面出現的指令:

cmake_minimum_required:指定執行此CMakeLists.txt檔案所需要的CMake的最低的版本,此時我們指定的最低的CMake版本是2.8

project:引數值是Demo,該命令表示我們要生成的專案的名稱是Demo1,project引數還可以標識專案支援的語言,寫法如下project(Demo1[C] [Java]),但是通常我們是將後面這些引數都省略掉,因為預設支援所有語言

add_executable():該命令表示我們使用Source.cpp原始檔;來生成名為Demo的可執行檔案

※※※※※※※※※※※※※指令和大小寫無關,但是引數以及變數是和大小有關的※※※※※※※※※※※※※※※※※※※※

情況二:一個目錄下,多個原始檔工程,假設現在有兩個原始檔:Source1.cpp 以及 Source2.cpp

那我們的CMakeLists.txt檔案就會成為下面這樣:

#CMake要求的最低點版本
cmake_minimum_requried(version 2.8)

#專案資訊
project (Demo1)

#指定生成的目標
add_executable(Dmeo Source1.cpp Source2.cpp)         

和之前的CMakeLists.txt對比,只有add_executable()的引數變了,因為現在我們需要依賴,兩個原始檔來生成可執行檔案。

當然如果此時我們有很多的原始檔需要我們去新增,一個一個的新增就會顯的很麻煩,此時我們可以去傳原始檔的路徑,然後CMake裡面就有專門的命令來收集引數路徑下面的原始檔,並把它們存放到變數中,這個命令就是:aux_source_directory命令,語法如下:

aux_sourcr_directory(<dir> <variable>)

這樣,我們的CMakeLists.txt就會變成:

# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)

# 專案資訊
project (Demo)

# 查詢當前目錄下的所有原始檔
# 並將名稱儲存到 DIR_SRCS 變數
aux_source_directory(. DIR_SRCS)

# 指定生成目標
add_executable(Demo ${DIR_SRCS})

aux_executable()引數:"."代表的是指定的原始檔路徑,CMake將該目錄下的原始檔找到之後,將其名字儲存在DIR_SRCS變數裡面。然後我們在之後生成指定目標的命令裡面就可以直接傳變數的名字就行了。

情況三:多個目錄多個資料夾,根目錄我們假設為:Source.cpp在./Source目錄下面,但是./Source目錄裡面還有一個名叫:Child目錄,裡面存放Child.cpp工程

對於這種情況,我們首先需要一個在Source目錄和Child目錄都去編寫一個CMakeLists.txt檔案,為了方便,我們可以將Child目錄下面的Child.cpp工程編譯成一個靜態庫,然後在Source.cpp裡面再去呼叫這個靜態庫,這樣我們的CMakeLists.txt就是下面這樣:

#CMake的最低版本
cmake_minimum_requried(VERSION 2.8)

#專案資訊
project(Demo)

#查詢當前目錄下的所有原始檔,然後將原始檔名儲存到變數DIR_SRCS裡面
aux_source_directory(. DIR_SRCS)

#新增Child子目錄
add_subdirectory(Child)

#指定生成目標
add_executable(Demo Source.cpp)

#新增連結庫
target_link_libraries(Demo Child)

命令解析:

add_subdirectory:指明本專案包含的一個子目錄Child,這樣的話,Child下面的CMakeLists.txt檔案和原始碼也會被處理

target_link_libraries:指明生成的Demo可執行檔案需要連線一個叫做:Child的連結庫

子目錄Child裡面的CMakeLists.txt:

#查詢當前目錄下的所有原始檔,然後將原始檔的名稱儲存到DIR_LIB_SRCS變數裡面
aux_source_directory(. DIR_LIB_SRCS)

#生成連結庫
add_library(Child DIR_LIB_SRCS)

命令解析:

add_library:將變數DIR_LIB_SRCS裡面的原始檔編譯成靜態連結庫