CMake的應用與實踐

1、認識Cmake以及應用

應用,與Gcc、Makefile、Autotools比較的優勢

一款非常優秀的工程構建工具。

特點與優勢:

(1)開放源代碼,具有BSD許可

(2)跨平臺,支持Linux、Mac和Windows等不同操作系統

(3)編譯語言簡單、易用,簡化編譯構建過程和編譯過程

(4)變成高效(比autotools快40%),可擴展(ros中catkin、ament、colcon都是基於CMake構建)

CMake與其他工具的比較

GCC:

由GNU開發的編程語言譯器,C/C++,Java的語言的開發;

當項目簡單,可以用gcc/g++編譯目標和項目;

但比較複雜時,只用gcc組織編譯架構變得極其困難;

Makefile:

Makefile是有條理的gcc編譯命令的文件,利用make工具來執行Makefile文件的編譯命令;

當程序簡單時,可以手動編寫Makefile;

當程序複雜時,使用cmake或者autotools來自動生成Makefile

Autotools:

autotools是一個工具類,具有靈活性較大,對用戶角度使用較好(cmake生成文件權限較多)

開發步驟太多,配置繁瑣(autoscan + autoconf + automake)

通常編譯的./config文件,大多通過由autotools構建的,最終生成Makefile和config.h文件

CMake:

CMake類似Make工具功能,用來“讀取”並執行CMakeLists.txt文件的語句,最終生成Makefile文件;

CMake語言開發相對簡單,易於理解;

目前很多項目正在拋棄Autotools、qmake,轉而採用cmake

 

 

2、CMake語句的主體框架

CMake問題分析思路,主體結構,語法的構成,及基本模塊功能

談到CMake我們能想到哪些問題?

(1)如何組織一個項目的編譯架構

(2)最終的輸出文件有哪些(可執行程序,靜態庫,動態庫等)

(3)如何配置輸出目標文件的指定比編譯參數()

 

3、CMake的常用指令及變量

基本常用指令(安裝、測試、調試等),常用的CMake語法變量含義

CMake語法的主體框架

 

command(arg1 arg2 ...)

set(var_name var_value)

command(arg1 ${var_name})

運行命令

定義變量,或者給已存在的變量賦值

使用變量

工程配置部分

cmake_minimum_required(VERSION num)

project(cur_project_name)

set(CMAKE_CXX_FLAGS "xxx")

set(CAMKE_BUILD_TYPE "xxx")

CMake最低版本號要求

定義項目名稱

設定編譯版本,如-std=c++11

設定編譯模式,如Debug/Release

系統執行部分

find_package(std_lib_name VERSION REQUIRED)

add_library(<name> [lib_type] source1)

include_directories(${std_lib_name_INCLUDE_DIRS})

add_executable(cur_project_name XXX.cpp)

target_link_libraries(${std_lib_name_LIBRARIES})

引入外部依賴

生成庫類型(動態,靜態)

指定include路徑,放在add_executable前面

指定生成目標

指定libraries路徑,放在add_executable後面

其他輔助部分

function(function_name arg)

add_subdirectory(dir)

AUX_SOURCE_DIRECTORY(. SRC_LIST)

FOREACH(one_dir ${SRC_LIST})

    message(${one_dir})

ENDFOREACH(onedir)

定義一個函數

添加一個子目錄

查找當前目錄所在文件,並保存在SRC_LIST變量中

 

使用message進行打印

判斷控制部分

if(expression)

    COMMAND1(args)

else(expression)

    COMMAND2(args)

endif(expression)

 

 

while(condition)

    COMMAND(args)

endwile(condition)

如下表達式均爲合法:

if(var)

if(NOT var)

if(var1 AND var2)

if(var1 OR var2)

if(COMMAND cmd)    //指定的cmd確實存在並且可以調用則爲真

if(EXISTS dir)    //目錄存在

if(EXISTS file)    //文件存在

if(IS_DIRECTORY dir)   //真 dir是目錄

if(file1 IS_NEWER_THAN file2)  //file1比file2新

if(variable MATCHES regex)  //符合正則

 

 

4、CMake的實踐應用

從簡單的CMake文件說起 -->  生成鏈接庫 -->  如何引用鏈接庫(內部&引用)  -->更簡單的組織CMake的編譯方式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章