make和Cmake都有什么区别?(内附使用详解)

Make和Cmake

make和Cmake的区别:

  1. 角色和功能:

    • make: 是一个构建工具,它的任务是读取 Makefile 文件,并基于这些文件中的指令执行具体的构建操作。Makefile 文件包含了如何构建项目的规则,make 负责解析这些规则并执行必要的命令来编译和链接源代码,生成可执行文件或库。
    • CMake: 是一个构建系统生成器。它并不直接进行编译或链接,而是根据项目中 CMakeLists.txt 文件的内容生成一个或多个构建系统的描述文件(如 Makefile 或 Visual Studio 解决方案)。CMake 提供了一种更高级、更抽象的方式来描述构建过程,这使得它能够跨平台地生成各种构建系统。
  2. 跨平台能力:

    • make: 通常与特定的平台相关联,尽管 Makefile 可以编写得足够通用以适应多个平台,但通常需要针对不同平台进行调整。
    • CMake: 设计为跨平台工具,能够在 Windows、macOS、Linux 等多种操作系统上使用相同的 CMakeLists.txt 文件生成适当的构建系统描述。
  3. 易用性和灵活性:

    • make: 相对简单,直接,但需要手动维护 Makefile 文件中的构建规则,这在大型项目中可能会变得复杂和难以管理。
    • CMake: 提供了更高级的抽象和更丰富的功能集,如条件语句、循环、函数定义等,这使得 CMakeLists.txt 文件可以编写得更加灵活和模块化。
  4. 生成的文件类型:

    • make: 生成 Makefile,这是一个文本文件,其中包含了 make 程序需要执行的具体命令。
    • CMake: 可以生成多种类型的构建系统描述文件,包括但不限于 Makefile、Ninja 构建文件、Visual Studio 解决方案 (.sln) 文件、Xcode 项目文件等。
  5. 依赖管理:

    • make: 依赖关系通常需要在 Makefile 中显式指定。
    • CMake: 提供了内置的机制来处理依赖关系,包括自动检测和配置外部库。

总结来说,make 更像是一个执行者,负责按照给定的规则执行构建操作,而 CMake 则是一个协调者,负责生成构建规则,使得 make 或其他构建工具能够有效地完成工作。在实际开发中,CMake 通常位于 make 的上游,先由 CMake 生成 Makefile 或其他构建系统描述,然后再由 make 或相应构建工具根据这些描述执行构建任务。

make:

在Linux环境中,make是一个极其重要的工具,主要用于自动化构建过程,尤其是软件项目。它基于一个名为Makefile的文件来决定需要执行哪些任务。下面我将详细解释make命令的使用和功能。

cmake:

CMake是一个开源的、跨平台的自动化构建系统,用来管理软件构建过程。它是用脚本语言编写的,主要用于工程较大的项目,可以生成各种不同构建系统的格式,比如Unix的Makefile、Windows的Visual Studio项目等。

Make常见选项的意义

  1. -f file: 指定一个特定的 Makefile 文件。默认情况下,make 查找名为 Makefilemakefile 的文件。

    make -f custom_makefile
  2. -C dir: 切换到指定目录并执行该目录下的 Makefile。

    make -C /path/to/dir
  3. -j [jobs]: 指定要并行执行的任务数。这个选项可以显著加快编译速度,尤其是在多核处理器上。

        你可以用lscpu来看一下你的cpu核数,进而选择多核编译

        

make -j4

  1. -k: 在遇到错误时继续编译其他目标。默认情况下,make 遇到错误会停止执行

     
    make -k
  2. -n: 显示但不执行命令。这对于调试 Makefile 很有用。

    make -k
  3. -s: 静默模式,不显示执行的命令,只输出结果

    make -s
  4. -B: 强制重新构建所有目标,无论目标文件是否是最新的。

    make -B
  5. --version: 显示 make 的版本信息。

make -B

Cmake使用示例:

假设我们有一个简单的 C++ 项目,包含一个源文件 main.cpp,我们想创建一个可执行文件,同时允许用户在构建时选择是否启用调试信息和测试。

Cmake

1cmake_minimum_required(VERSION 3.10)
2project(SimpleProject)
3
4option(ENABLE_DEBUG "Enable debug information" OFF)
5option(ENABLE_TESTS "Build tests" OFF)
6
7if (ENABLE_DEBUG)
8    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
9endif()
10
11if (ENABLE_TESTS)
12    add_subdirectory(tests)
13endif()
14
15add_executable(${PROJECT_NAME} main.cpp)

分析:

  1. cmake_minimum_required: 这行指定了 CMake 最低版本要求,确保 CMake 版本兼容。

  2. project: 定义了项目的名称,这里为 SimpleProject

  3. option: 添加构建选项。第一个参数是选项的名称,第二个参数是描述,第三个参数是默认值(ON 或 OFF)。在上面的例子中,我们添加了两个选项:

    • ENABLE_DEBUG: 控制是否生成调试信息。
    • ENABLE_TESTS: 控制是否构建测试代码。
  4. if: 根据选项的状态执行不同的操作。例如,如果 ENABLE_DEBUG 选项被开启,则会向 C++ 编译器标志中添加 -g 选项,以生成调试信息。

  5. add_executable: 创建一个可执行文件。这里的 ${PROJECT_NAME} 将会被替换为 project 命令中定义的项目名称。

  6. add_subdirectory: 如果 ENABLE_TESTS 选项被开启,那么会递归调用 CMake 来构建 tests 子目录下的内容。这意味着你可以有独立的测试子项目。

构建过程:

当你运行 CMake 时,你可以传递选项来覆盖默认值,例如:

Bash

1mkdir build
2cd build
3cmake .. -DENABLE_DEBUG=ON -DENABLE_TESTS=ON
4make

在这个命令中,-D 后面跟的是选项名称和值,这会覆盖 CMakeLists.txt 文件中的默认设置。

选项的意义:

  • ENABLE_DEBUG: 当这个选项被开启时,你的程序将带有调试信息,这对于开发和调试阶段是非常有用的。但是,对于最终产品或性能敏感的应用,你可能不希望包含这些额外的信息,因为它可能会增加程序的大小和影响性能。

  • ENABLE_TESTS: 这个选项允许你构建测试代码。在大型项目中,通常会有专门的测试代码来验证功能的正确性。通过这个选项,你可以在需要时构建和运行测试,而在不需要时避免这些额外的构建步骤,节省时间和资源。

通过这种方式,CMake 允许你以一种灵活的方式控制构建过程,适应不同的构建需求和环境。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

webshell获取总结(cms获取方法、非cms获取方法、中间件拿Webshell方法)

目录 前期准备: 1、cookices靶场网站搭建: 2、dedecms靶场环境搭建: 获取Webshell方法总结: 一、CMS获取Webshell方法 二、非CMS获取Webshell方法 1、数据库备份获取Webshell 例如: 2、抓包上传获取Webshell 3、…

什么是APS计划排程? 企业产能与效率提升的智能引擎

快节奏和愈发激烈的现代工业环境中,如何提升生产效率、降低生产成本、最大化的满足订单交期、实现企业的降本增效,已成为众多企业关注的焦点。而APS系统——作为高级生产计划和调度系统的代表,正以其卓越的生产过程实时监控、产品加工过程优化…

[CAN] 创建解析CAN报文DBC文件教程

👉本教程需要先安装CANdb软件,[CAN] DBC数据库编辑器的下载与安装 🙋前言 DBC(全称为Database CAN),是用于描述单个CAN网络中各逻辑节点的信息。 DBC是汽车ECU(Electronic Control Unit,电子控制单元&…

Java面试八股之构造方法有哪些特性

构造方法有哪些特性 方法名与类名相同:构造方法的名称必须与它所在的类名称完全相同,包括大小写。 无返回类型:构造方法没有返回类型声明,连void也不需要。虽然没有明确的返回类型,但它隐式地返回了新创建的实例的引…

基于Java的诊所医院管理系统,springboot+html,MySQL数据库,用户+医生+管理员三种身份,完美运行,有一万一千字论文

演示视频 基本介绍 基于Java的诊所医院管理系统,springboothtml,MySQL数据库,用户医生管理员三种身份,完美运行,有一万一千字论文。 用户:个人信息管理、预约医生、查看病例、查看公告、充值、支付费用...…

后端开发面经系列 -- 小鹏汽车一面面经

小鹏汽车一面面经 公众号:阿Q技术站 来源:职言详情页 (maimai.cn) 文章目录 小鹏汽车一面面经1、String类型为什么不可变?1. 安全性2. 缓存和性能优化3. 哈希码缓存4. 类设计和接口5. 简单性和可读性 2、在浏览器中输入url地址到显示主页的过…

一文搞懂flex布局

上学读书的时候,学习flex布局,更多停留在理论知识层面。近来,经过工作实践,发现自己对flex布局的理解更加深入,运用起来更加熟练,也越发能感受到flex布局的强大灵活性,特来总结一波。若有错误之…

Linux部署mysql8.0.28数据库

目录 1.基础准备 (1)首先去官网下载二进制安装包 (2)下载好之后上传至服务器 (3)禁用关闭selinux和防火墙 (4)挂载光盘搭建本地yum仓库 2.解压到指定目录 3.检查系统是否安装mariadb 4.安装MySQL数据库 (1)进入MySQL目录 看到‘完毕’就说面mysql已经安装成功了 4.初…

2024-6-12-IXI(mat)应用到SR的代码解读

数据集 Download and decompress data from the link 百度网盘 请输入提取码 Password: qrlt Transform .h5 format to .mat format "python convertH5tomat.py --data_dir XXX/T2Net/h5 论文:Task Transformer Network for Joint MRI Reconstruction and Super-Resoluti…

大数据概论总结

三次信息化浪潮 : 信息技术的支撑 : 存储设备容量不断增加 CPU的处理能力不断提高 网络带宽不断增加 数据产生方式的变革促成大数据时代的来临 运营式系统阶段用户原创内容感知式系统阶段 大数据发展历程 : 分为三个阶段 : 大数据的概念 : 1 . 数据量大 : 根据IDC作出…

量产导入 | Tessent Scan 和 ATPG

目标 Upon completion of this module, you should be able to: Use Tessent Scan to insert full scan. Write a scan-inserted netlist file. Write ATPG setup files. lnsert test logic. Create, configure, and balance scan chains. Edit a scan chain order file and …

PyCharm2018图文安装教程、附录软件下载

软件简介 PyCharm 2018是一款IDE集成开发环境,主要功能包括代码调试、语法高亮、智能提示、单元测试、版本控制等,支持Python 3.7,改进search everywhere功能等,可以让用户快速的开发程序。 软件下载 复制链接浏览器打开 https…

Java基础面试重点-1

0. 符号: *:记忆模糊,验证后特别标注的知识点。 &:容易忘记知识点。 *:重要的知识点。 1. 简述一下Java面向对象的基本特征(四个),以及你自己的应用? 抽象&#…

GStreamer安装——Android

Android安装 支持所有从2.3.1Gingerbread开始的版本 先决条件 开发机器是您开发Android应用程序的地方,然后您将其部署在目标机器上,目标机器显然应该是Android设备。 开发机器可以是Linux、Mac OS X或Windows,并且需要安装: 最…

私有云数据库特征

私有云数据库具有以下几个主要特征: 控制和安全: 数据控制:组织对数据有完全的控制权,可以根据需要设置访问权限和安全策略。安全性:私有云数据库通常部署在组织内部的数据中心,利用内部网络&#xff0c…

爆款AI工具大盘点:最强文本、视频、音乐生成AI,适用岗位全解析!

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

Linux部署项目

手动部署 1.在IDEA写一个有关springboot项目 在windows客户端可以通过localhost:8080/hello 访问 2.用packge 命令将该springboot项目打包 并在target目录下找到打包的jar包 3.上传到linux上 个人习惯在usr/local/app 下上传该项目 创建切换到app目录下 mkdir /usr/local/ap…

互联网医院系统源码的创新应用:预约挂号小程序开发实战

预约挂号小程序作为互联网医院系统的创新应用,更加贴近用户需求,实现了预约挂号的便捷化和智能化。本篇文章,笔者将带领读者进入预约挂号小程序开发的实战过程,探索互联网医院系统源码在小程序开发中的创新应用。 一、互联网医院系…

UML相关1

汽车租赁系统中的用例图简述(10分) 本系统根据功能可以分为三个用例图: 客户用例图:主要描述客户注册、登录、找回密码、查询车辆信息(包括所有车辆信息、已借车辆信息、租赁历史信息)、修改个人信息、网上预订车辆、电话预定车…

java多线程临界区介绍

在Java多线程编程中,"临界区"是指一段必须互斥执行的代码区域。当多个线程访问共享资源时,为了防止数据不一致或逻辑错误,需要确保同一时刻只有一个线程可以进入临界区。Java提供了多种机制来实现这一点,例如synchroniz…