什么是Cmake和Makefile?

2023-05-16

目录

1.前言

2.什么是Makefile

3.什么是Cmake

 4.Cmake的语法规则


1.前言

在学习视觉SLAM十四讲的时候,对这个Cmake的概念不太清楚(笔者是机械方向转到SLAM这个方向的),在看了很多大神的讲解后,有所收获,写下这篇笔记方便复习(如果写的有什么不对的地方欢迎批评指正),也希望对各位读者有所帮助。在我看到关于Cmake的解释中,有篇文章写的非常通俗易懂,该链接我放在了下方,建议读者可以看看。

什么是Cmakeicon-default.png?t=M1L8https://www.hahack.com/codes/cmake/

2.什么是Makefile

       Makefile类似一个脚本文件定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,有效地描述这些文件之间的依赖关系以及处理命令。当个别文件改动后,仅执行必要的处理,而不必重复整个编译过程。

(Cmake是用来生成makefile的一个工具:读入所有源文件之后,自动生成makefile)

3.什么是Cmake

         不同的系统平台有不同的make工具(编译工具),如下表所示(这里只列举下面三个):

平台        Linux      QT              微软
make工具    GNU make    qmake         MS nmake

        不同的make工具遵循着不同的规范和标准,所执行的Makefile格式也不同,这就导致如果软件想跨平台,就必须以跨越的那个平台为标准写一次Makefile,如果跨的平台够多,这将是令人抓狂的工作量。

        Cmake就是针对上述问题所设计的工具:首先它允许开发者编写一种平台无关的CmakeList.txt文件来制定整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化Makefile和工程文件,如windows的Visual Studio工程。从而做到“Write once,run everywhere”。显然,Cmake是一个比上述几种make更高级的编译配置工具。一些使用Cmake作为项目架构系统的知名开源项目有:VTK、ITK、KDE、OpenCV、OSG等等。

         举个例子:在Ubuntu里的ROS的操作系统中,不管是C++还是python还是什么其他语言写的功能包都可以运行,前提是功能包下要有CMakelist.txt这个必要元素之一(如图一),这样ROS就可以将不是本平台的文件通过Cmake编译成本地的makefile文件,再由本地的编译工具make,编译生成可执行文件(目标文件)。(如图二)

 

                                                 图一:最精简的功能包两个必要元素

 

                                                         图二: Cmake流程详解

 4.Cmake的语法规则

建议观看在前言附上的链接,写的十分详细

https://www.hahack.com/codes/cmake/

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是Cmake和Makefile? 的相关文章

  • ubuntu 中的 echo -e 选项不起作用

    我的同事使用Ubuntu 我使用openSUSE 我们使用相同的makefile编译相同的源代码 我的环境运行良好 但我的同事不能 总是输出无法识别 e选项 我们检查makefile 只发现echo命令使用 e option Ubuntu的
  • 如何使用cmake查找库?

    要将可执行文件与驻留在标准位置的库链接 可以在 CmakeLists txt 文件中执行以下操作 create executable generate mesh generate mesh cpp target link libraries
  • 带包装的 CMAKE RPATH

    我正在使用 cmake 创建包 我有以下结构 bin bin1 lib lib1 lib2 其中lib1和lib2是外部动态库 如何设置 RPATH 以便它自动与 lib1 和 lib2 链接 我也在这方面对 cmake 很感兴趣 Cmak
  • 如何指定CMAKE外部项目的编译器?

    我使用ExternalProject Add 包含一个外部项目 我想要的是能够做到 cmake DCMAKE CXX COMPILER
  • 如何最好地为 Visual Studio 2017 构建的 CMake C++ 项目设置输出目录?

    我使用 Visual Studio 2017 使用 vcxproj 文件构建 C 桌面项目 我喜欢默认行为 其中输出目录是项目下面的子目录 例如 myproj sln myproj vcxproj x64 myproj release my
  • 使用cmake交叉编译gRPC

    我正在尝试使用 cmake 交叉编译 gRPC 我实际上做到了 不幸的是 我的方法涉及在 CMakeLists txt 内部进行修改 问题是 当我尝试编译 gRPC 时 它使用的是他刚刚编译的 protobuffer 它无法在 x86 计算
  • Cmake:链接到静态内部库而不导出它

    我有一个具有以下结构的项目 path to my project CMakeLists txt internal libs internal lib1 libs lib1 lib2 lib1是一个静态库 lib2是一个静态库 interna
  • Opencv - 找不到头文件

    我正在尝试使用 opencv 开始开发 问题是 到目前为止我几乎无法设置 opencv 因为我找不到它的头文件 我对此主题进行了一些研究 但没有一个真正有帮助 下面是一些链接 opencv2 包含文件在哪里 https stackoverf
  • 使用 CMake 编译时更改头文件位置会导致缺少 vtable 错误

    对于一个大型 C 项目 我需要从 qmake 过渡到 CMake 但是在处理一个玩具示例时 我遇到了一些我不理解的行为 示例代码具有单个头文件 当该头文件移动到子目录中时 我收到 MainWindow 类缺少 vtable 的错误 CMak
  • Windows 上 gnu make 的 libintl3 和 libiconv2 在哪里,需要在 MinGW 上用 ruby​​ 编译 vim

    我正在尝试为 Windows 运行 gnu make 但它无法运行 因为libint3 dll没找到 果然 http gnuwin32 sourceforge net packages make htm http gnuwin32 sour
  • CMake source_group() 无法在分层项目设置中正常工作

    在进行更改以使 CMake 项目具有分层文件夹管理后 source group 似乎不再正常工作 CMake 只是将所有内容转储到默认过滤器中 我尝试了各种正则表达式来从父级获取每个源文件的相对文件路径 甚至对父级 CMakeLists t
  • CMake第三方库安装

    我是编程新手 对于我的研究项目 我需要安装一个第三方库以便与 CMake 一起使用 GitHub项目 https github com cpp io2d P0267 RefImpl blob master BUILDING md 我在我的电
  • 从 makefile 内部传递命令行参数

    我有一个 makefile 我试图从中调用一个可执行文件 该可执行文件需要 5 个参数 我如何从 makefile 传递这些参数 这样做不起作用 run exe arg1 somevalue arg2 somevalue arg3 some
  • 如何处理GNU make中的子make错误?

    我在 Makefile GNU 中使用子 make 但每当子 make 失败时 主 make 都会继续成功运行 我希望每当我的子 make 失败时我的主 Makefile 都会失败 我怎么做 all pushd STA DIR make c
  • CMake:Fortran 模块和编译顺序

    我有一个大型 Fortran 程序 其中包含许多目录 每个目录都在伪库中单独编译 但仍然存在相互依赖的混乱 因此最终所有伪库都组合在一个可用的库中 我想使用 Fortran 模块 但它非常脆弱 因为我不能依赖自动依赖项检查 并且根据顺序编译
  • 如何让 Makefile 目标被多次调用?

    在下面的简单示例中 我想做一个make dist并拥有distclean之前执行的目标distdebug and distrelease PHONY distclean dist distdebug distrelease echo in
  • 使用 Makefile 项目在 Visual Studio 中自定义调试命令

    我在 Visual Studio 2010 中有一个由 Makefile 支持的项目 实际上使用 NAnt 但这不是重点 构建过程的输出是一个 elf 文件 我有一个单独的非 VStudio 调试器 可以在该 elf 文件上运行来调试它 构
  • 如何使用 Clang 编译器和 CMake 进行分析

    Question 1 What output我应该期待当我想使用进行分析时clang编译器 2 我该怎么办profiling for a C project它使用clang作为编译器andCMake 作为构建工具 重新分析我所使用的内容 1
  • 如何有条件地将 ALL 选项添加到 add_custom_target()?

    我想有条件地包含目标docs html to ALL如果用户选择 DO HTML 切换cmake gui 如何避免这种丑陋的代码重复 cmake minimum required VERSION 3 3 FATAL ERROR projec
  • 如何在 VS Code 中为 CMake 项目设置 C/C++ IntelliSense?

    我正在尝试使用 libTooling 编写一个工具 我对其进行了设置 以便它可以使用 LLVM 文档中的示例进行编译 然而 C C IntelliSense 似乎不适用于 CMake 项目 我的工具位于

随机推荐

  • 模拟IIC——关于模拟IIC的IO口的配置选取推挽输出还是开漏输出,以及是否需要更改IO口输入输出模式和是否需要对IO配置上拉

    在使用模拟IIC的时候 xff0c 观看别人的程序的时候发现了程序之间的一些不一样的地方 代码1 IO方向设置 define SDA IN GPIOB gt MODER amp 61 3 lt lt 9 2 GPIOB gt MODER 6
  • C语言——链表

    C语言 链表 链表是一种基础的数据结构类型 xff0c 一种能够动态维护数据的线性数据表 链表的数据以结点形式存储信息 xff0c 并通过结点之间的指针实现结点之间的衔接 为什么要用链表 xff1f 链表和数组类似 xff0c 但是功能比数
  • 学习记录 | ZigBee协议栈工作流程

    第一次来CSDN记录一下学习过程 xff0c 其实就是笔记啦 之前用Typora 的 但前几天电脑出问题重装系统后打开笔记文件发现照片都打不开了 xff0c 索性想换一种记笔记方式 好啦 以下是正文 xff01 xff01 xff01 对了
  • 学习记录 | ZigBee协议栈实践——串口收发数据

    上次的理论知识学的有点杂乱 今天来跟着例程实践看一看 目录 一 ZigBee协议栈的安装 编译和下载 二 协议栈工作流程 三 串口通信主要代码 1 串口打印 2 串口打印收到的数据 四 实现 五 总结 一 ZigBee协议栈的安装 编译和下
  • 第一次画异形板后的总结感悟

    目录 画原理图前的准备 画PCB的一些好方法 蜂鸣器电路 供电电路 其他电路 杂七杂八的随记要点 总结 像这样的异形板是通过solidworks扫描实物生成的 画原理图前的准备 当然是选购元器件 一般习惯在嘉立创进行选购 选择符合要求 有库
  • 自学物联网ESP第一天

    先简单的使用串口通信AT指令 刚开始不知道用什么开发好 在博客找了很久本来打算用 eclipse 不过突然发现可以用Arduino 不过下载真的好慢 于是开始看一下函数准备一下 一 基本函数 1 setup 函数 Arduino控制器通电或
  • stm32串口发送+接收

    本文章转自B站江科大自化协 一发送 接线图 目标结构 Serial c include 34 stm32f10x h 34 include lt stdio h gt 1移植printf函数 封装sprintf include lt std
  • vscode配置C/C++环境(超详细保姆级教学)

    大一上学期被学长安利了vscode xff0c 但是下载安装后不会配置 xff0c 自己连查带问搞了七八个小时终于配置好了 后面身边很多同学也不会配 xff0c 都来找我帮忙配 xff0c 加上之前自己摸索着配的时候感觉网上没有详细又靠谱的
  • 路由器接口解析

    ensp 接口解析 路由器的CON和AUX con是串口 xff0c 接口电脑串口可以进路由器的命令行查看和设置 一般为设备的控制端口 xff0c Console端口使用配置专用连线直接连接至计算机的串口 xff0c 利用终端仿真程序进行路
  • 解决VSCode写html文件时<!+Enter导入模板快捷键没办法使用的问题

    好久没有写前端了 xff0c 先是用模板快捷键 lt 43 Enter导入模板 xff0c 发现没有办法使用 找到网上一些资料 xff0c VSCode使用 html 5 取代了之前的生成模板快捷键 示例 xff1a 在空白html文本里逐
  • LVGL 之 windows 上 lvgl 模拟器 基于 Visual Studio 搭建方法的简单整理

    mark GUI Guider与lvgl联合仿真 xff08 结合stm32实验进行演示 xff0c 含触摸屏实验计数器与计算器 xff09 https blog csdn net gudao07 article details 12752
  • 初认识stm32 ————每日小总结(串口通信初始化基础操作)

    留下代码 xff0c 日后复习 c文件 include 34 my uart h 34 void my uart init NVIC PriorityGroupConfig NVIC PriorityGroup 2 设置中断优先级分组 RC
  • Sqoop全量导入mysql表数据到HDFS

    我是在三个节点运行的 xff0c 主节点只有namenode和mysql数据库 1 开启服务 具有NameNode和DataNode start all sh 2 进入sqoop的目录下并且输入代码 下面的命令用于从 MySQL 数据库服务
  • 在字符串中查找子字符串

    查找子串 include lt stdio h gt char Search char str1 char str2 char s1 61 str1 char s2 61 str2 char cur 61 str1 while cur s1
  • 基于相机云台周期运动的“远帧差”图像处理算法

    传统的帧差法针对前后两帧或者某几帧进行图像处理 xff0c 一旦相机视角转动 xff0c 就不能获得很好的检测效果 xff0c 我所参与的项目就是一个云台搭载一台红外相机进行取像 xff0c 这样可以大幅度的节约成本 xff0c 但是对图像
  • 深究C语言4.链表和结构体

    目录 一 xff0c 结构体 一 xff0c 结构体的定义 二 xff0c 结构体的概念 1 2 3 4 5 6 三 xff0c 结构变量的使用 1 结构变量的操作符 gt 和 2 结构变量的赋值 3 结构变量作为函数参数 4 结构指针 5
  • 使用c++解析http\https数据遇到的问题(附代码)

    开发环境 xff1a vs2019 系统 xff1a win10 openssl版本 xff1a Win32OpenSSL 3 0 7 访问网页 xff1a www baidu com 先说明以下问题 xff1a c 43 43 在发送ht
  • vector的使用

    vector的介绍 1 vector是表示可变大小数组的序列容器 2 vector就像数组一样 xff0c 也采用的连续空间来存储元素 xff0c 这也意味着可以采用下标对vector的元素进行访问 3 vector与普通数组不同的是 xf
  • Linux系统( Centos 7) 配置与管理Apache服务器实例详细步骤

    Linux系统 xff08 Centos 7 xff09 配置与管理Apache服务器实例详细步骤 服务器centos7 1 1 配置网络 root 64 centos7 vim etc sysconfig network scripts
  • 什么是Cmake和Makefile?

    目录 1 前言 2 什么是Makefile 3 什么是Cmake 4 Cmake的语法规则 1 前言 在学习视觉SLAM十四讲的时候 xff0c 对这个Cmake的概念不太清楚 xff08 笔者是机械方向转到SLAM这个方向的 xff09