Linux下cmake使用簡介

2021-07-11 12:11:52 字數 4334 閱讀 9750

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($)  //用${} 來引用變數
4.去哪找庫檔案 類似-l
link_directories($)
5.生成可執行檔案
add_ececutable( test $)  //生成乙個執行檔案test,原始檔來自src_list的原始檔列表
6.要鏈結的庫檔名稱
target_link_libraries(test $)  //相當於是鏈結了-lphread -lice
7.向終端輸出資訊
message( satus "this is binary dir"

$) //輸出工程所在目錄

語法為message([send_error| status| fatal_error] 「message」…)

send_error,產生錯誤,生成過程被跳過

satus -,輸出字首為「—」的資訊。

fatal_error,立即終止所有的cmake過程

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

$/bin) //可執行檔案的輸出路徑為build/bin

set(library_output_path

$/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安裝到

$/bin目錄下

動態庫libmylib安裝到

$/lib

普通檔案安裝:

install(files files...  destination

[permissions permissions...]

[configurations [debug | release| ...]]

[component]

)

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

Linux下安裝和使用cmake

sudo tar zxvf cmake 3.8.2.tar.gz 2 進入解壓縮後的資料夾中,依次輸入 sudo bootstrap sudo make sudo make install 3 安裝檢查 輸入命令,cmake version 若出現對應cmake的版本,則說明安裝成功,一般預設安裝在...

Linux下使用CMake編譯程式

參考 你或許聽過好幾種 make 工具,例如 gnu make qt 的 qmake 微軟的 ms nmake,bsd make pmake makepp,等等。這些 make 工具遵循著不同的規範和標準,所執行的 makefile 格式也千差萬別。這樣就帶來了乙個嚴峻的問題 如果軟體想跨平台,必須...

linux下使用cmake構建C C 專案

wget tar zxvf cmake 2.8.10.2.tar.gz cd cmake 2.8.10.2 configure gmake 不知道是不是必須的,提示要這麼幹 make make install 文件裡說 bootstrap make make install 這樣安裝,沒試過 使用方...