歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

Linux下cmake使用簡介

安裝

sudo apt-get install cmake 這個應該是最簡單的方法了,當然,你也可以去官網下載:www.cmake.org

然後運行

cmake –version 查看一下你是否安裝完成

使用

cmake好像都說比直接寫Makefile牛一點,因為它可以自動生成Makefile。專門針對文件比較多的情況,要不是這幾天在用別人的代碼,一大堆,我覺得用Makefile也夠了,但是據說Linux程序員必備技能啊,所以還是要學學這麼高端的東西。 在源代碼目錄src中建立CMakeLists.txt文件

先介紹點常用的:

1,工程名

[code]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中,我們也會使用。不過是直接用“=”來定義。
[code]set (INC_DIR /usr/local/include)  //頭文件路徑
set (LINK_DIR /usr/local/lib)     //庫的路徑
set (SRC_LIST main.cpp )          //源文件名稱,源文件可以有多個,之間用空格隔開
set (LIB pthread Ice)           //庫的名稱

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

3.去哪找頭文件,類似-I

[code]include_directories(${INC_DIR})  //用${} 來引用變量

4.去哪找庫文件 類似-L

[code]link_directories(${LINK_DIR})

5.生成可執行文件

[code]add_ececutable( test ${SRC_LIST})  //生成一個執行文件test,源文件來自SRC_LIST的源文件列表

6.要鏈接的庫文件名稱

[code]target_link_libraries(test ${LIB})  //相當於是鏈接了-lphread -lIce

7.向終端輸出信息

[code]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目錄,

運行

[code]cmake ../src  //../src代表工程目錄,主要是找到CMakeLists
查看一下build目錄,就會發現生成了一些中間文件,

然後運行 make ,就會在build目錄下獲得目標文件test

注意: 上面我們提高過工程的兩個隱藏變量,TEST_SOURCE_DIR仍然指代工程目錄:src/ 。TEST_BINARY_DIR 則指代編譯目錄:/build/

10.添加源文件子目錄

[code]ADD_SUBDIRECTORY(src bin)  //定義src子目錄加入工程,並指定編譯輸出路徑為bin目錄
這個指令用於向當前工程添加存放源文件的子目錄,並可以指定中間二進制和目標二進制存放的位置。

以hello world 為例

建立Hello目錄,並建立子目錄

[code]Hello/src
Hello/build
在src目錄下建立main.c文件,一個簡單打印一句話

並在Hello目錄下建立CMakeLists.txt

[code]PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)
並在src目錄下也建立CMakeLists.txt,需要為任何子目錄建立一個CMakeLists.txt

[code]ADD_EXECUTABLE(hello main.c)
然後進入到build目錄下:

[code]cmake ..
make
構建完成後,會發現生成的目標文件位於build/bin目錄中。

如果不進行bin目錄的指定,那麼編譯結構將存在build/src目錄中,指定bin目錄,相當於在編譯時,將src重命名為bin

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

我們可以通過SET指令重新定義EXECUTABLE_OUTPUT_PATH和LIBRARY_OUTPUT_PATH變量來指定最終的目標二進制的位置(最終生成的hello或者最終的共享庫)
[code]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來定義安裝路徑,就要寫成相對路徑,不要以/開頭。

例子:

[code]INSTALL(TARGETS myrun mylib mystaticlib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic
)
將可執行二進制myrun安裝到

${CMAKE_INSTALL_PREFIX}/bin
目錄下 動態庫libmylib安裝到

${CMAKE_INSTALL_PREFIX}/lib
普通文件安裝:

[code]INSTALL(FILES files...  DESTINATION
        [PERMISSIONS permissions...]
        [CONFIGURATIONS  [Debug | Release| ...]]
        [COMPONENT]
)
用於安裝一般文件,並可以指定訪問權限,文件名是此指令所在路徑下的相對路徑,如果默認不定義權限PERMISSIONS,安裝後的權限為(644)。

Copyright © Linux教程網 All Rights Reserved