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

2024-06-13 00:20

本文主要是介绍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 允许你以一种灵活的方式控制构建过程,适应不同的构建需求和环境。

这篇关于make和Cmake都有什么区别?(内附使用详解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1055757

相关文章

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

MySQL数据库约束深入详解

《MySQL数据库约束深入详解》:本文主要介绍MySQL数据库约束,在MySQL数据库中,约束是用来限制进入表中的数据类型的一种技术,通过使用约束,可以确保数据的准确性、完整性和可靠性,需要的朋友... 目录一、数据库约束的概念二、约束类型三、NOT NULL 非空约束四、DEFAULT 默认值约束五、UN

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的