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的编译方式

 一般的工程目录:

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)

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值