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.去哪找庫檔案 類似-llink_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 這樣安裝,沒試過 使用方...