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的編譯方式