CMake的应用与实践

news2024/11/26 4:21:08

CMake 简介

CMake是什么?

  • 全称 Cross Platform Make,起初为了跨平台需求,而后不断完善并广泛使用
  • 一款优秀的工程构建工具

特点和优势

  • 开放源代码,具有BSD许可
  • 跨平台,支持Linux,Mac和Windows等不同操作系统
  • 编译语言简单,易用,简化编译构建过程和编译过程
  • 编程高效(比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+autocconf+automake)
    • 通常编译的config文件,大多通过autotools构建的,最终生成Makefile和config.h文件
  • CMake

    • CMake类似Make工具功能,用来“读取”并执行CMakeLists.txt文件的语句,最终生成Makefile文件
    • CMake语言开发简单,易于理解

CMake语句的主体框架

主体框架:

  • 工程配置部分:工程名、编译调试模式、编译系统语言
  • 依赖执行部分:工程包,头文件、依赖库等
  • 其他辅助部分(非必需):参数打印、遍历目录等
  • 判断控制部分(非必需):条件判断、函数定义、条件执行等

在这里插入图片描述
在这里插入图片描述

CMake的常用指令以及变量

基本常用指令

  • ADD_EXECUTABLE

    • 为源文件的编译添加由-D引入的宏定义
    • 命令格式为 : add_definitions(-DFOO -DBAR ...)
    • 宏定义操作:
      在这里插入图片描述
  • OPTION

    • 提供用户可以选择的选项。
    • 命令格式为 :option(<variable> "description [initial value])

在这里插入图片描述

  • ADD_CUSTOM_COMMAND/TARGET

    • [COMMAND] : 为工程添加一条自定义的构建规则。
    • [TARGET] : 用于给指定名称的目标执行指定的命令,该目标没有输出文件,并始终被构建。
      在这里插入图片描述
  • ADD_DEPENDENCIES(没懂)

    • 用于解决链接时依赖的问题。
    • 当定义的target依赖的另一个target,确保在源码编译本target之前,其他的target已经被构建,使用该语句。
  • INSTALL

    • 用于定义安装规则,安装的内容可以包括目标二进制、动态库、静态库以及文件、目录、脚本等。
      在这里插入图片描述
  • TARGET_INCLUDE_DIRECTORIES

    • 设置include文件查找的目录,具体包含头文件应用形式,安装位置等。
    • 命令格式为:target_include_directories(<target>[SYSTEM][BEFORE]<INTERFACE|PUBLIC|PRIVATE> [items])
      在这里插入图片描述
  • SET_TARGET_PROPERTIES

    • 设置目标的一些属性来改变它们构建的方式。
    • 命令格式为:
      在这里插入图片描述
  • ENABLE_TESTING/ADD_TEST

    • [enable_testing] :用来控制Makefile是否构建test目标。
    • [add_test] : 一般需要和enable_testing()配合使用
    • 命令格式为:ADD_TEST(testname Exename arg1 arg2 …)
    • 生成makefile后可用make test执行测试
      在这里插入图片描述

基本常用变量

变量名具体含义
CMAKE_INSTALL_PREFIX构建install的路径
$ENV{HOME}HOME环境下的目录路径
PROJECT_NAME工程名变量
< PKG >_INCLUDE_DIR导入包头文件全路径
< PKG >_LIBRARIES导入库文件的全路径
PROJECT_SOURCE_DIR构建工程的全路径
CMAKE_VERSIONCmake的版本号
CMAKE_SOURCE_DIR源码树的顶层路径

实践应用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/551893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C生万物】 字符串内存函数篇 (上)

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《C生万物 | 先来学C》&#x1f448; 前言&#xff1a; 过了指针这个坎后&#xff0c;下一步就是C语言中关于字符的处理&#xff0c;这一期来讲…

chatgpt赋能Python-python5个一行

Python: 5行代码改变世界 Python是一种高级编程语言&#xff0c;以其简单易学的特性而闻名。Python的发明者Guido van Rossum在1980年代末和1990年代初创造了Python&#xff0c;旨在创建一种语言&#xff0c;既易于理解又易于使用。如今&#xff0c;Python已经成为了最受欢迎的…

【离散数学】陪集和拉格朗日定理编程题

1&#xff1a;编写一个程序能够计算有限群G的子群H的左陪集 输入一个n阶有限群G的二元运算表及相关的子群&#xff0c;输出其左陪集。 &#xff08;注意&#xff1a;按照表头元素顺序计算每个陪集&#xff0c;下图为G的二元运算表示例&#xff09; 样例1&#xff1a; 输入&…

干货 | 利用SPSS进行高级统计分析第三期

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 在本期中&#xff0c;我们继续为大家介绍如何利用SPSS进行&#xff1a;单因素方差分析、多因素方差分析、重复测量方差分析等。 1. 单因素方差分析【组间实验单一因变量&#xff1b;进行差…

iptables防火墙中的SNAT和DNAT

SNAT的原理和应用 SNAT 应用环境∶局域网主机共享单个公网IP地址接入Internet &#xff08;私有IP不能在Internet中正常路由&#xff09; SNAT原理∶修改数据包的源地址。 SNAT转换前提条件∶ 局域网各主机已正确设置IP地址、子网掩码、默认网关地址Linux网关开启IP路由转发…

游资92科比到底牛在哪里?

昨天一天时间把92科比之前的一个帖子全部看完&#xff0c;从科比对情绪周期的把握来看那简直总结的已经是标准答案了&#xff0c;那么为何92科比公布了答案&#xff0c;还是有很多人“痛苦”的做不到&#xff1f; 这个问题我觉得跟退学炒股是一样的&#xff0c;退学先解决了小…

springcloud-alibaba (03)sentinel下载安装

Sentinel 一&#xff0c;下载安装&#x1f4a0;二&#xff0c;编写脚本&#x1f9ff;三&#xff0c;启动sentinel&#x1f48e;四&#xff0c;Win-访问控制台✨ 在Linux中下载安装Spring Cloud Alibaba Sentinel&#xff0c;可以按照以下步骤进行操作&#xff1a; 一&#xff0…

Python常见面试题. Python中的解包操作及其应用场景

这是个简单的知识点&#xff0c;但有的同学并不理解 unpacking解包 解&#xff0c;对应的是*或者**&#xff0c;也有自动解包之说 包对应的可迭代对象 Python助学大礼包点击跳转获取 目录 一、自动解包二、数据过多的解包*三、星号在函数中的使用四、两个星号的解包五、场…

Lesson13---人工神经网络(2)

13 人工神经网络&#xff08;2&#xff09; 多层神经网络-非线性分类问题多层神经网络的损失函数不是凸函数&#xff0c;很难计算解析解通常采用梯度下降法&#xff0c;得到数据解&#xff0c;梯度下降法可以用来求解函数极值问题 批量梯度下降随机梯度下降小批量梯度下降 1…

[Nacos] Nacos Client获取所有服务和定时更新Client端的注册表 (三)

文章目录 1.Nacos Client获取所有服务1.1 Client如何获取所有服务1.2 Client获取服务方法getServices()详解 2.Nacos定时更新Client端的注册表2.1 Nacos和Eureka定时更新Client端的注册表的区别2.2 Client定时更新本地服务过程2.3 updateServiceNow方法解析2.4 定时更新本地注册…

DrissionPage学习(一)

一、下载适合mac环境的chromedriver.exe 1.查找chrome浏览的版本 方法二&#xff1a;查看chrome版本信息 2.确定版本后在下载chrome对应的chromedriver.exe 下载地址&#xff1a;http://chromedriver.storage.googleapis.com/index.html 3.在文件夹中找到下载的文件chro…

MyBatis-Plus or() equls() 连用的格式为 a AND (b OR c)

正确示范&#xff1a; userInterfaceQueryWrapper.and(qw -> qw .eq("status", UserInterfaceInfoStatusEnum.OFFLINE) .or() .eq("status", UserInterfaceInfoStatusEnum.TRYOUT));错误示范&#xff1a; userInterfaceQueryWrapper.eq("status&…

分布式项目10.jsonp 使用js中script的属性src进行服务器之间的访问

一般使用ajax来访问不同服务器的数据&#xff0c;可行吗&#xff1f; 做个实验&#xff1a; 第一步&#xff1a;在本服务器中使用ajax技术访问本服务器数据 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>测试JSON跨域…

NFT游戏Mythical Beings将参加NFT Polygon 在线展会

Mythical Beings神秘生物是由Tarasca Art & Games 开发的基于区块链的卡牌收集游戏。游戏中每张卡牌所拥有的属性和背后的故事都是独一无二的&#xff0c;Mythical Beings不仅具有游戏属性&#xff0c;还兼具故事的传承。 作为一款跨链Polygon的NFT游戏&#xff0c;Mythic…

Transformer架构解析

1.Transformer架构图 本文主要来自&#xff1a;http://nlp.seas.harvard.edu/annotated-transformer/#hardware-and-schedule 论文地址: https://arxiv.org/pdf/1810.04805.pdf 1.1 Transformer模型的作用 基于seq2seq架构的transformer模型可以完成NLP领域研究的典型任务,…

ThinkPHP6模型中的获取器,修改器及搜索器的简单使用

ThinkPHP6模型中的获取器&#xff0c;修改器及搜索器的简单使用 1. 获取器2. 修改器3. 搜索器 1. 获取器 获取器的作用是对模型实例的&#xff08;原始&#xff09;数据做出自动处理。一个获取器对应模型的一个特殊方法&#xff08;该方法必须为public类型&#xff09;&#x…

MySQL(用户管理)

文章目录 1 用户1.1 用户信息1.2 创建用户1.3 删除用户1.4 修改用户密码 2 数据库的权限2.1 给用户授权2.2 回收权限 1 用户 1.1 用户信息 MySQL中的用户&#xff0c;都存储在系统数据库mysql的user表中 host&#xff1a; 表示这个用户可以从哪个主机登陆&#xff0c;如果是l…

GPT专业应用:如何让GPT策划方案

身为一名职场打工人&#xff0c;或多或少会面临需要写策划案的难题。 不管是策划一场线下活动&#xff0c;还是策划业务发展的方向&#xff1b; 甚至到生活中还需要策划婚礼&#xff0c;策划房屋装修&#xff0c;策划和朋友的聚会等等。那么如何快速积累经验&#xff0c;找准…

项目管理基础:什么是项目管理?

一、项目管理的缘起与发展 项目管理并非基础学科&#xff0c;它是人类在生产实践中不断的经验积累所总结归纳的一门学科&#xff0c;在人们不断的完善与修订下逐步形成了现有的项目管理知识体系。 项目经理是随着人们对项目管理要求的提升而逐渐分化出的一个专业职位&#xf…

SNAT与DNAT的应用

目录 一、SNAT概述 1.SNAT应用环境——局域网共享上网 2. SNAT工作原理 2.1未作SNAT转换时 2.2进行SNAT转换后 二、配置SNAT策略 1.开启IP路由转发 2.SNAT转换 3.模拟实验 3.1服务端 3.2网关服务器 3.3网关服务器设置iptables规则 3.4客户端 3.5实验结果 三、DNAT概…