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

相关文章

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

css中的 vertical-align与line-height作用详解

《css中的vertical-align与line-height作用详解》:本文主要介绍了CSS中的`vertical-align`和`line-height`属性,包括它们的作用、适用元素、属性值、常见使用场景、常见问题及解决方案,详细内容请阅读本文,希望能对你有所帮助... 目录vertical-ali

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

Spring组件初始化扩展点BeanPostProcessor的作用详解

《Spring组件初始化扩展点BeanPostProcessor的作用详解》本文通过实战案例和常见应用场景详细介绍了BeanPostProcessor的使用,并强调了其在Spring扩展中的重要性,感... 目录一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessB

MyBatis的配置对象Configuration作用及说明

《MyBatis的配置对象Configuration作用及说明》MyBatis的Configuration对象是MyBatis的核心配置对象,它包含了MyBatis运行时所需的几乎所有配置信息,这个对... 目录MyBATis配置对象Configuration作用Configuration 对象的主要作用C

MySQL表锁、页面锁和行锁的作用及其优缺点对比分析

《MySQL表锁、页面锁和行锁的作用及其优缺点对比分析》MySQL中的表锁、页面锁和行锁各有特点,适用于不同的场景,表锁锁定整个表,适用于批量操作和MyISAM存储引擎,页面锁锁定数据页,适用于旧版本... 目录1. 表锁(Table Lock)2. 页面锁(Page Lock)3. 行锁(Row Lock

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使