Cmake中 makefiles 的作用

2024-05-08 19:28
文章标签 作用 cmake makefiles

本文主要是介绍Cmake中 makefiles 的作用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

传统意义上的 Makefiles 是用于自动化构建过程的文件,主要在 Unix-like 系统(如 Linux 和 macOS)上使用。Makefiles 定义了如何编译和链接程序,包括编译指令、源文件、目标文件、依赖关系和最终的可执行文件。Makefiles 是由 make 工具使用的,make 是一个构建自动化工具,用来控制和自动化编译过程。

为什么说传统意义上的 Makefiles 呢?
因为有专门为 Windows 或 Visual Studio 环境设计的 Makefiles,
命令为: cmake -G "Visual Studio 16 2019" -A x64
这里的 “Visual Studio 16 2019” 是生成器名称,表示你要生成 Visual Studio 2019 的项目文件。-A x64 是指定目标架构为 64 位。当然,你应该根据你安装的 Visual Studio 版本来调整生成器的名称。例如,如果你使用的是 Visual Studio 2022,你应该使用 “Visual Studio 17 2022” 作为生成器。

通过这种方式生成的项目文件可以直接在 Visual Studio 中打开,你可以利用 Visual Studio 的各种功能,如调试、代码编辑和项目管理等。

Makefiles 作用

Makefiles 用来描述如何编译和链接一个程序。简单地说,它告诉计算机如何从源代码文件(如 .cpp 文件)生成可执行文件。

Makefiles 的组成

一个 Makefile 主要由三部分组成:

  • 目标(Targets):通常是你想生成的文件,比如可执行文件或对象文件。目标后面跟着冒号。
  • 依赖(Dependencies):这些是构建目标所必需的文件,如源代码或其他目标。它们写在目标的后面,用空格隔开。
  • 规则(Rules):在新行中,用一个制表符(Tab)开始,这些是实际的命令,用来生成目标。

示例解释
让我们通过一个例子来更清楚地理解:

# 这是一个注释# 目标:可执行文件 'program'
program: main.o utils.og++ -o program main.o utils.o  # 这一行是编译命令,用来链接对象文件生成可执行文件# 目标:对象文件 'main.o'
main.o: main.cppg++ -c main.cpp  # 这一行是编译命令,用来把 'main.cpp' 编译成 'main.o'# 目标:对象文件 'utils.o'
utils.o: utils.cppg++ -c utils.cpp  # 这一行是编译命令,用来把 'utils.cpp' 编译成 'utils.o'

在这个 Makefile 中:

  • 目标 program 依赖于 main.o 和 utils.o。
  • 命令 g++ -o program main.o utils.o 用于链接 main.o 和 utils.o 来创建 program(可执行文件)。
  • 目标 main.o 依赖于 main.cpp,而命令 g++ -c main.cpp 将 main.cpp 编译成对象文件 main.o。
  • 同理,utils.o 依赖于 utils.cpp,命令 g++ -c utils.cpp 将 utils.cpp 编译成对象文件 utils.o。

使用 Makefile

当你在命令行中输入 make 并按回车时,make 程序会查找名为 “Makefile” 的文件,并尝试执行它定义的第一个目标(在这个例子中是 program)。make 会检查所有的依赖项(如 .o 文件和 .cpp 文件),只重新编译那些自上次编译后已经被修改的文件,这样可以节省时间。

这篇关于Cmake中 makefiles 的作用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

MySQL日志UndoLog的作用

《MySQL日志UndoLog的作用》UndoLog是InnoDB用于事务回滚和MVCC的重要机制,本文主要介绍了MySQL日志UndoLog的作用,文中介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、Undo Log 的作用二、Undo Log 的分类三、Undo Log 的存储四、Undo

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

JAVA transient 关键字作用详解

《JAVAtransient关键字作用详解》Java的transient关键字用于修饰成员变量,使其不参与序列化过程,通过自定义序列化方法,可以手动控制transient变量的序列化行为,本文给大... 目录一、transient关键字作用二、原理详解三、典型使用场景四、代码示例五、注意事项六、与 stat

Spring Boot/Spring MVC核心注解的作用详解

《SpringBoot/SpringMVC核心注解的作用详解》本文详细介绍了SpringBoot和SpringMVC中最常用的15个核心注解,涵盖了请求路由映射、参数绑定、RESTfulAPI、... 目录一、Spring/Spring MVC注解的核心作用二、请求映射与RESTful API注解系列2.1

C#中的sealed修饰符的作用详解

《C#中的sealed修饰符的作用详解》在C#中,sealed修饰符的作用是“密封”用来阻止类被继承,或者阻止方法/属性在派生类中被重写,接下来通过本文给大家介绍C#中的sealed修饰符的作用详解,... 目录✅ 1.sealed用于类(class)作用:示例:✅ 2.sealed用于方法或属性(必须与

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

python常用的正则表达式及作用

《python常用的正则表达式及作用》正则表达式是处理字符串的强大工具,Python通过re模块提供正则表达式支持,本文给大家介绍python常用的正则表达式及作用详解,感兴趣的朋友跟随小编一起看看吧... 目录python常用正则表达式及作用基本匹配模式常用正则表达式示例常用量词边界匹配分组和捕获常用re

Java 继承和多态的作用及好处

《Java继承和多态的作用及好处》文章讲解Java继承与多态的概念、语法及应用,继承通过extends复用父类成员,减少冗余;多态实现方法重写与向上转型,提升灵活性与代码复用性,动态绑定降低圈复杂度... 目录1. 继承1.1 什么是继承1.2 继承的作用和好处1.3 继承的语法1.4 子类访问父类里面的成