1. 程式人生 > >Linux下cmake使用簡介

Linux下cmake使用簡介

安裝

sudo apt-get install cmake
這個應該是最簡單的方法了,當然,你也可以去官網下載:www.cmake.org
然後執行
cmake –version 檢視一下你是否安裝完成

使用

cmake好像都說比直接寫Makefile牛一點,因為它可以自動生成Makefile。專門針對檔案比較多的情況,要不是這幾天在用別人的程式碼,一大堆,我覺得用Makefile也夠了,但是據說Linux程式設計師必備技能啊,所以還是要學學這麼高階的東西。
在原始碼目錄src中建立CMakeLists.txt檔案
先介紹點常用的:

1,工程名

project(TEST)
//表明工程名稱,也可以指定工程支援的語言,預設情況下支援所有

這個指令隱式的定義了兩個cmake變數:
_BINARY_DIR 和_SOURCE_DIR,在這裡就是TEST_BINARY_DIR和TEST_SOURCE_DIR ,在採用內部編譯時,這個兩個變數指的都是工程所在路徑。
同時系統也幫助我們預定義了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR變數,他們的值分別跟TEST_BINARY_DIR TEST_SOURCE_DIR一致。為了統一,建議直接使用PROJECT_BINARY_DIR,因為即使改變工程名,也不會影響這兩個變數。
注意這個工程名TEST和可執行檔案test時沒有關係的,可執行檔名可以隨意取。

2,命名變數

這個意思就是#define,用一些變數來代替多次出現的一些比較繁瑣的路徑之類的,這個在makefile中,我們也會使用。不過是直接用“=”來定義。

set (INC_DIR /usr/local/include)  //標頭檔案路徑
set (LINK_DIR /usr/local/lib)     //庫的路徑
set (SRC_LIST main.cpp )          //原始檔名稱,原始檔可以有多個,之間用空格隔開
set (LIB pthread Ice)           //庫的名稱

使用${}來引用變數,但是有一個列外,在IF控制語句中,變數是直接使用變數名引用。

3.去哪找標頭檔案,類似-I

include_directories(${INC_DIR})  //用${} 來引用變數

4.去哪找庫檔案 類似-L

link_directories(${LINK_DIR})

5.生成可執行檔案

add_ececutable( test ${SRC_LIST})  //生成一個執行檔案test,原始檔來自SRC_LIST的原始檔列表

6.要連結的庫檔名稱

target_link_libraries(test ${LIB})  //相當於是連結了-lphread -lIce

7.向終端輸出資訊

message( SATUS "this is binary dir" ${TEST_BINARY_DIR})  //輸出工程所在目錄

語法為message([SEND_ERROR| STATUS| FATAL_ERROR] “message”…)
SEND_ERROR,產生錯誤,生成過程被跳過
SATUS -,輸出字首為“—”的資訊。
FATAL_ERROR,立即終止所有的cmake過程

8.指令的大小寫無關,引數和變數 大小寫是相關的,推薦全部使用大寫指令,大家別學我。

9.內部構建和外部構建

我們上面使用的就是內部構建,就是在工程檔案目錄下執行cmake,然後產生一堆臨時檔案,和原始碼混在一塊,看著都頭疼。
首先先將src目錄下的臨時檔案刪除,只留下CMakeLists.txt,和原始檔。
在src同級下建build目錄,進入到build目錄,
執行

cmake ../src  //../src代表工程目錄,主要是找到CMakeLists

檢視一下build目錄,就會發現生成了一些中間檔案,
然後執行 make ,就會在build目錄下獲得目標檔案test
注意
上面我們提高過工程的兩個隱藏變數,TEST_SOURCE_DIR仍然指代工程目錄:src/ 。TEST_BINARY_DIR 則指代編譯目錄:/build/

10.新增原始檔子目錄

ADD_SUBDIRECTORY(src bin)  //定義src子目錄加入工程,並指定編譯輸出路徑為bin目錄

這個指令用於向當前工程新增存放原始檔的子目錄,並可以指定中間二進位制和目標二進位制存放的位置。
以hello world 為例
建立Hello目錄,並建立子目錄

Hello/src
Hello/build

在src目錄下建立main.c檔案,一個簡單列印一句話
並在Hello目錄下建立CMakeLists.txt

PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)

並在src目錄下也建立CMakeLists.txt,需要為任何子目錄建立一個CMakeLists.txt

ADD_EXECUTABLE(hello main.c)

然後進入到build目錄下:

cmake ..
make

構建完成後,會發現生成的目標檔案位於build/bin目錄中。
如果不進行bin目錄的指定,那麼編譯結構將存在build/src目錄中,指定bin目錄,相當於在編譯時,將src重新命名為bin

11.換個地方儲存目標二進位制

我們可以通過SET指令重新定義EXECUTABLE_OUTPUT_PATH和LIBRARY_OUTPUT_PATH變數來指定最終的目標二進位制的位置(最終生成的hello或者最終的共享庫)

SET(EXECUTABLE_OUTPUT_PATH${PROJECT_BINARY_DIR}/bin)   //可執行檔案的輸出路徑為build/bin
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) //庫的輸出路徑為build/lib

PROJECT_BINARY_DIR在最開始我們已經說明過。
但是這些變數放在哪個CMakeLists.txt中呢?
一條原則:如果需要改變目標存放路徑,在哪裡ADD_EXECUTABLE或ADD_LIBRARY,就在哪裡新增上述定義。本例子中當然是src目錄下的txt

12.如何安裝

新的cmake指令:INSTALL
變數:CMAKE_INSTALL_PREFIX 類似configure 指令碼的prefix
使用方法:
cmake -DCMAKE_INSTALL_PREFIX = /usr
INSTALL 指令用於定義安裝規則,安裝的內容可以包含目標二進位制、動態庫、靜態庫以及檔案、目錄、指令碼等。
INSTALL包含了各種安裝型別
目標檔案的安裝:
INSTALL( TARGETS targets…
[[ARCHIVE]|LIBRARY| RUNTIME]
[DESTINATION]
[PERMISSIONS permissions…]
[CONFIGURATIONS [Debug | Release| …]]
[COMPONENT]
[OPTIONAL]
)
引數型別 TARGETS後面就是我們定義的目標檔案,如hello ,可能是可執行二進位制、動態庫、靜態庫
目標型別有三種,ARCHIVE指靜態庫,LIBRARY特指動態庫,RUNTIME特指可執行目標二進位制。
DESTINATION定義了安裝路徑,如果路徑是以/開頭,那麼指的是絕對路徑,這個時候,CMAKE_INSTALL_PREFIX其實就無效了,如果你希望使用CMAKE_INSTALL_PRFIX來定義安裝路徑,就要寫成相對路徑,不要以/開頭。
例子:

INSTALL(TARGETS myrun mylib mystaticlib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic
)

將可執行二進位制myrun安裝到
${CMAKE_INSTALL_PREFIX}/bin目錄下
動態庫libmylib安裝到
${CMAKE_INSTALL_PREFIX}/lib

普通檔案安裝:

INSTALL(FILES files...  DESTINATION
        [PERMISSIONS permissions...]
        [CONFIGURATIONS  [Debug | Release| ...]]
        [COMPONENT]
)

用於安裝一般檔案,並可以指定訪問許可權,檔名是此指令所在路徑下的相對路徑,如果預設不定義許可權PERMISSIONS,安裝後的許可權為(644)。