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的编译方式
一般的工程目录:
build
CMakeLists.txt
include
src
举例
cmake_minimum_required(VERSION 2.83)
project(hello_cv_1)
add_compile_options(-std=c++11)
include_directories(include)
add_executable(hello_cv_1 src/main.cpp src/hello_cv_1.cpp)