cmake構建語言梳理總結

2021-10-25 09:03:06 字數 4107 閱讀 7736

二、cmake的使用以及語法書寫規範

三、cmake常用變數

四、常用命令

五、控制指令

六、列印資訊控制 - message

七、其它

八、導學:

九、cmake文件:

1、make是什麼?

在大型的linux開發專案中,通常有幾十到上百個原始檔,如果每次通過手工鍵入gcc命令進行編譯不切實際,為此,提供了乙個make工具來自動編譯和維護專案原始碼,make執行的物件是使用make語法寫成的即makefile檔案;

2、make工具的種類:

gnu make ,qt 的 qmake ,微軟的 ms nmake,bsd make(pmake),makepp,等等;

3、cmake是什麼,解決什麼問題?

先來看問題,make工具固然好用,但存在以下兩個問題:

問題1:

不同的 make 工具遵循著不同的規範和標準,所執行的 makefile 格式也千差萬別。這樣就帶來了乙個嚴峻的問題:如果軟體想跨平台,必須要保證能夠在不同平台編譯。而如果使用上面的 make 工具,就得為每一種標準寫一次 makefile ,這將是一件讓人抓狂的工作;

問題2:

makefile在一些簡單的工程完全可以人工手下,但是當工程非常大的時候,手寫makefile也是非常麻煩的,如果換了個平台makefile又要重新修改。

好了,介紹cmake工具,跟make工具形式一樣,需要使用cmake語法寫出指令碼,然後執行,cmake可以更加簡單的生成makefile檔案給上面那個make用。當然cmake還有其他功能,就是可以跨平台生成對應平台能用的makefile,你不用再自己去修改了。

類似cmake工具作用的還有scon等。

總結:

gcc命令難以管理大型工程->make難以編寫以及移植性差->cmake編寫簡單且可輕鬆移植;

1、cmake的使用

a、需要安裝cmake工具;

b、執行cmake指令碼:cmake c、cmake執行完後會在當前資料夾生成大量的原始碼副本、makefile等,一般會建立乙個tmp臨時目錄,在臨時目錄中執行cmake命令,有個好處可以保持源**的整潔;

2、一般的書寫順序,以下是個最簡單的例子:

#a、開頭部分 - 版本控制資訊,專案名

cmake_minimum_required (version 2.6)

project (tutorial)

#b、中間部分 - 新增標頭檔案、庫

include_directories ("$/mathfunctions")

add_library(mathfunctions mysqrt.cxx)

#c、結尾部分 - 生成的目標可執行檔案

add_executable(tutorial tutorial.cxx)

cmake的命令是不區分大小寫的;

cmake指令碼:使用cmake自帶的變數和cmake命令搭建整體架構,如果需要,自行定義變數或者實施操作(也由cmake命令實現);

cmake命令格式:command(arg1 arg2 arg3 … argn)

1、預定義變數:cmake_c_flags、cmake_cxx_flags

2、系統資訊變數:cmake_major_version、cmake_patch_version

3、編譯選項變數:build_shared_libs、build_static_libs

4、自定義變數:定義使用set(obj_name ***x),引用時$

1、aux_source_directory()

用於將 dir 目錄下的所有原始檔的名字儲存在變數 variable 中;

2、add_executable( [win32] [macosx_bundle][exclude_from_all] source1 source2 … sourcen)

用於指定從一組原始檔 source1 source2 … sourcen 編譯出乙個可執行檔案且命名為 name

3、命令語法:add_library([static | shared | module] [exclude_from_all] source1source2 … sourcen)命令簡述:用於指定從一組原始檔 source1 source2 … sourcen 編譯出乙個庫檔案且命名為 name

4、命令語法:add_dependencies(target-name depend-target1 depend-target2 …)命令簡述:用於指定某個目標(可執行檔案或者庫檔案)依賴於其他的目標。這裡的目標必須是 add_executable、add_library、add_custom_target 命令建立的目標

5、命令語法:add_subdirectory(source_dir [binary_dir] [exclude_from_all])命令簡述:用於新增乙個需要進行構建的子目錄

6、命令語法:set( [[cache [force]] | parent_scope])命令簡述:用於設定變數 variable 的值為 value。如果指定了 cache 變數將被放入 cache(快取)中

1、if 指令,基本語法為:

if(expression)

command(args ...)

else(expression)

command1(args ...)

endif(expression)

2、while 指令的語法是:
while(condition)

command1(args ...)

endwhile(condition)

3、foreach 指令:

該指令使用方法有三種形式:

a、列表

foreach(loop_var arg1 arg2 ...)

command1(args ...)

endforeach(loop_var)

#即會遍歷arg1 arg2...

#像我們前面使用的 aux_source_directory 的例子

aux_source_directory(. src_list)

foreach(f $)

message($)

endforeach(f)

b、範圍

foreach(loop_var range total)

endforeach(loop_var)

#從 0 到 total 以1為步進,舉例如下:

foreach(var range 10)

message($)

endforeach(var)

c、範圍和步進

foreach(loop_var range start stop [step])

endforeach(loop_var)

#從 start 開始到 stop 結束,以 step 為步進,舉例如下

foreach(a range 5 15 3)

message($)

endforeach(a)

message 指令的語法是:

message([send_error | status | fatal_error] 「message to display」…)

這個指令用於向終端輸出使用者定義的資訊,包含了三種型別:

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

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

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

我們在這裡使用的是 status 資訊輸出,演示了由 project 指令定義的兩個隱式變數

hello_binary_dir 和 hello_source_dir。

1、包含其它cmake檔案:使用include( 其它cmakelist位置 )

cmake語言相對簡單,熟悉常用的內建變數與命令即可寫出大部分功能的cmakelist指令碼,至於大型工程中必然巢狀大量的cmakelist,整體的編譯架構會稍微複雜些,注意梳理其中的包含關係即可;

CMAKE自動構建

cmake 入門實戰 cmake 手冊詳解 兩個自己寫的cmakelists.txt用到了常用的編譯功能 cmake 最低版本號要求 cmake minimum required version 2.8 指定c編譯器 set cmake c compiler arm none linux gnuea...

Cmake 構建程式

cmake 是乙個跨平台的自動化建構系統,它使用乙個名為 cmakelists.txt 的檔案來描述構建程式,可以產生標準的構建檔案,如 unix 的 makefile。cmakelists.txt 需要手工編寫,也可以通過編寫指令碼進行半自動的生成。cmake 提供了比 autoconfig 更簡...

cmake構建qt工程

如何選擇?using cmake to build qt projects 一文中說 儘管如此,如果簡單qt的工程都不知道怎麼用 cmake 構建,複雜的工程,就更不知道如何使用 cmake 了。還是從簡單的學起吧 include include qdebug int main int argc,c...