Makefile 详解

news2024/11/16 1:58:50

文章目录

    • 1.什么是Makefile
    • 2.Makefile文件命名规则
    • 3.编写Makefile
    • 4.Makefile 的工作原理
    • 5.Makefile中的变量
    • 6.模式匹配
    • 7.函数


1.什么是Makefile

  • 一个工程中的源文件不计其数,按期类型、功能、模块分别放在若干个文件中,MakeFile文件定义了一系列的规则来制定哪些文件需先要编译、哪些文案需要后编译、哪些文件需要重新编译、甚至于进行更加复杂的操作,因为Makefile文件就像是一个shell脚本一样,也可以执行操作系统的命令

  • Makefile 带来的好处就是 自动化编译,一旦写好,只需要一个make命令,整个工程完全自动化编译,极大提高了软件开发效率,make是一个命令工具,是一个解释Makefile文件中指令的命令工具,一般来说,大多数的IDE都有这个命令,例如Delphi的make、Visual C++的nmaek、Linux下Gun的make。

2.Makefile文件命名规则

  • 文件命名:Makefile或者makefile
  • makefile规则
    • 一个Makefile文件中可以有一个或者多个命名规则
      目标… : 依赖 …
      命令(shell命令)
      • 目标:最终要生成的文件
      • 依赖:生成目标所需要的文件或者目标
      • 命令:通过执行命令对依赖金慈宁宫操作从而生成目标(命令前必须tab缩进)
  • Makefile中的其他规则一般都是为第一条规则服务的

3.编写Makefile

  1. 创建Makefile文件
vim Makefile
  • 编辑Makefile文件,行其中编写编译命令
app:add.cpp div.cpp mutil.cpp subtract.cpp
        gcc -lstdc++  add.cpp div.cpp mutil.cpp subtract.cpp main.cpp  -o app

在这里插入图片描述

  • 执行编译后的程序
    在这里插入图片描述

4.Makefile 的工作原理

  • 执行命令之前需先检查规则中的依赖是否存在
    • 如果存在,执行命令
    • 如果不存在,向下检查其他规则,检查有没有一个规则是用来生成这个依赖的,如果找到了则执行改规则中的命令
  • 检测更新
    • 如果依赖的时间比目标的时间晚,则需要重新生成目标
    • 如果依赖的时间比目标的时间早,目标不需要更新,对应规则中的目标不需要执行。

在这里插入图片描述
Makefile

app:add.o div.o mutil.o subtract.o main.o
        gcc -lstdc++  add.o div.o mutil.o subtract.o main.o  -o app

add.o:add.cpp
        gcc -c add.cpp -o add.o
div.o:div.cpp
        gcc -c div.cpp -o div.o
mutil.o:mutil.cpp
        gcc -c mutil.cpp -o mutil.o
subtract.o:subtract.cpp
        gcc -c subtract.cpp -o subtract.o
main.o:main.cpp
        gcc -c main.cpp -o main.o

5.Makefile中的变量

  • 自定义变量
    变量名 = 变量值 var = hello 获取变量:$var

  • 预定义变量
    AR:归档维护程序的名称,默认为ar
    CC:c编译器的名称,morenwcc
    CXX:C++b编译器的名称,默认为g++
    $@:目标的完整名称
    $<:第一个依赖文件的名称
    $^:所有依赖文件

  • 获取变量的值
    $()变量名
    自动变量只能在规则的命令中使用

app:main.c  a.c  b.c
	$(CC) -c $^ -o  $@

示例:

#定义变量
src=add.o div.o mutil.o subtract.o main.o
target=app
$(target):$(src)
        $(CC) -lstdc++ $(src) -o $(target)

add.o:add.cpp
        gcc -c add.cpp -o add.o

div.o:div.cpp
        gcc -c div.cpp -o div.o
mutil.o:mutil.cpp
        gcc -c mutil.cpp -o mutil.o
subtract.o:subtract.cpp
        gcc -c subtract.cpp -o subtract.o
main.o:main.cpp
        gcc -c main.cpp -o main.o

6.模式匹配

%.o:%.c
%:通配符,匹配一个字符串
两个%之间匹配的是同一个字符串

在这里插入图片描述

#定义变量
src=add.o div.o mutil.o subtract.o main.o
target=app
$(target):$(src)
        $(CC) -lstdc++ $(src) -o $(target)

#通配指令
%.o:%.c
        $(CC) -c $< -o $@

7.函数

  • $(wildcard PATTERN…)

    • 功能:获取指定目录下指定类型的文件列表
    • 参数: PATTERN指的是某个或者多个路径下对应的某种类型的文件,如果有多个目录,一般使用空格来间隔
    • 返回:得到若干个文件的文件列表,文件名之间用空格来间隔
    • 示例:
      $(wildcard .c ./sub/.c)
      返回格式:a.c b.c c.c d.c e.c
  • $(patsubst pattern, replacement,text)

    • 功能:查找 中的单词(单词以“空格”、“Tab”、或者“回车”、“换行”分割)是否符合模式,如果匹配的话,用进行替换
    • 可以包括通配“%”,标识任意长度的字符串,如果 中也包含“%”,那么 中的“%”就是中的“%”所代表的的字符串
    • 返回:函数返回被替换过的字符串
      $(patsubst %.c, %.o,x.c bar.c)
      返回格式:x.o bar.o
      在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HIN应用调研总结

文章目录1. 代码安全iDev: enhancing social coding security by cross-platform user identification between GitHub and stack overflow【A】2. API推荐Group preference based API recommendation via heterogeneous information network【A】3.Andorid恶意软件检测Out-of-…

SSM甜品店系统计算机毕业论文java毕业设计选题源代码

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 计算机毕业设计java毕设之SSM甜品店系统-IT实战营_哔哩哔哩_bilibili项目资料网址: http://itzygogogo.com软件下载地址:http://itzygogogo.com/i…

中英双语多语言外贸企业网站源码系统 - HanCMS - 安装部署教程

随着跨境独立站的流行&#xff0c;中英双语的公司官网越来越受到重视。 此项目是基于开源CMS开发出的中英文双语外贸企业网站内容管理系统&#xff0c;命名HanCMS HanCMS 汉CMS中英双语多语种外贸网站系统&#xff0c;是一个轻量级的网站系统&#xff0c;访问速度极快&#xff…

[附源码]计算机毕业设计小太阳幼儿园学生管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

威伦触摸屏TK6060IP简单例子

详情见以下链接 https://download.csdn.net/download/weixin_39926429/87242438

[附源码]Python计算机毕业设计SSM教务管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于连续小波变换的厄尔尼诺海平面周期变化数据集分析

基于连续小波变换的厄尔尼诺海平面周期变化数据集分析1. 厄尔尼诺海平面周期变化数据集介绍2. 基于连续小波变换的信号分析2.1 原始信号读取可视化2.2 傅里叶变换结果可视化2.3 小波变换结果可视化参考资料后记1. 厄尔尼诺海平面周期变化数据集介绍 这些数据是通过国际热带海洋…

文件上传的multipart/form-data属性,你理解了吗

form表单经常用于前端发送请求&#xff0c;比如&#xff1a;用户填写信息、选择数据、上传文件&#xff0c;对于不同的场景&#xff0c;上传数据的格式也会有些区别。 action action 表示该请求的 url 地址&#xff0c;定义在form上&#xff0c;请求的URI&#xff0c;可以写完…

【Python自然语言处理】文本向量化的六种常见模型讲解(独热编码、词袋模型、词频-逆文档频率模型、N元模型、单词-向量模型、文档-向量模型)

觉得有帮助请点赞关注收藏~~~ 一、文本向量化 文本向量化&#xff1a;将文本信息表示成能够表达文本语义的向量&#xff0c;是用数值向量来表示文本的语义。 词嵌入(Word Embedding)&#xff1a;一种将文本中的词转换成数字向量的方法&#xff0c;属于文本向量化处理的范畴。 …

Linux操作系统~基于systemV共享内存的进程间通信

目录 一.进程间通信有哪些方式 二.什么是systemV 三.共享内存-双向通信-大致实现思路 四.4个函数about共享内存 1.shmget函数-创建 ftok函数 ​编辑 e.g. ipcs/ipcrm指令&#xff08;ipc资源会被回收吗&#xff09; 2.shmctl函数-删除/释放 3.shmat函数-挂接 4.shmdt…

汽车以太网简史

一、为啥需要新车载总线 在一个行业中&#xff0c;当一种新技术被开发和启用时&#xff0c;影响该技术成功的因素有很多。其中最重要的是该技术带来的益处以及自身成本。 第一个吃螃蟹的 2004年宝马决定从2008年起在其开始量产&#xff08;SOP&#xff09;的汽车中引入一个中…

c++ 指针

目录 1.指针的基本概念 2.定义指针&#xff0c;使用指针 3.指针所占的内存空间 4.空指针和野指针 4.1空指针 4.2野指针 5.const修饰指针 5.1常量指针 5.2指针常量 5.3const既修饰指针又修饰常量 6.指针和数组,利用指针访问数组 6.1概述 6.2使用数组名和下表访问 6.3使用…

【LIN总线测试】——LIN主节点数据链路层测试

系列文章目录 &#x1f4d2;【LIN总线测试】——LIN主节点物理层测试 &#x1f4d2;【LIN总线测试】——LIN从节点物理层测试 &#x1f4d2;【LIN总线测试】——LIN主节点数据链路层测试 &#x1f4d2;【LIN总线测试】——LIN主节点网络管理测试 &#x1f4d2;【LIN总线测试】…

Docker consul的容器服务更新与发现

1&#xff09;什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&#xff0c;起初…

一软一硬:记录我的工作电脑两次出现性能问题的分析思路和解决过程

作为一个程序员&#xff0c;每天工作中糟心的事情之一&#xff0c;莫过于自己用来编码的计算机&#xff0c;运行速度忽然变得奇慢无比。尤其像我这种年过四旬仍然在一线从事编码工作的老程序员来说&#xff0c;只有靠不断提高单位时间的产出效率&#xff0c;来弥补和年轻程序员…

网课搜题接口

网课搜题接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击跳转&#xff09; 题库…

【leetcode】 盛最多水的容器

一、题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾…

移动通信:数字调制技术(BPSK, DPSK, QPSK, Π/4 QPSK,BFSK, MSK, GMSK, M-ary)学习笔记

文章目录Factors That Influence the Choice of Digital ModulationBandwidth and Power Spectral Density of Digital SignalsPulse Shaping TechniquesGeometric Representation of Modulation SignalsLinear Modulation TechniquesBPSKDifferential Phase Shift Keying (DPS…

软件定义汽车的关键—车载操作系统

文章目录 前言一、车载系统是什么&#xff1f;二、车载系统在智能汽车中的应用总结前言 智能网联大环境变革情况下&#xff0c;软件定义汽车理念已成行业共识。 传统分布式E/E架构因如下原因&#xff1a; 计算能力不足&#xff08;车规芯片&#xff09;&#xff1b;通讯带宽不…

树和二叉树

目录 1.树的概念及结构 1.1树的概念 1.2.树的表示 1.2.1孩子兄弟表示法 2.2双亲表示法 1.3二叉树在实际中的应用 2.二叉树的概念及结构 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树的实现及其的一些接口&#xff08;链式&#xff09; 2.4.1二叉树的…