C语言-Makefile

Makefile

  • 什么是make?
    • make 是个命令,是个可执行程序,用来解析 Makefile 文件的命令
    • 这个命令存放在 /usr/bin/
  • 什么是 makefile?
    • makefile 是个文件,这个文件中描述了我们程序的编译规则
    • 咱们执行 make 命令的时候, make 命令会在当前目录下找 makefile 文件,根据 makefile 文件里的规则,编译程序。
  • 注意: Makefile 规则文件是,程序员根据自己的程序编写的编译规则
  • 采用 Makefile 的好处
    • 简化编译程序的时候输入的命令,编译的时候只需要敲 make 命令就可以了
    • 可以节省编译时间,提高编译效率

1. make概述

GNU make 是一种代码维护工具

② make 工具会 根据 makefile 文件定义的规则和步骤,完成整个软件项目的代码维护工作

一般用来简化编译工作,可以极大地提高软件开发的效率

④ windows 下一般由集成开发环境自动生成

⑤ linux 下需要由我们按照其语法自己编写

1.1 检查是否有 make命令

命令:检查版本

make --version

在这里插入图片描述

1.2 make 和 Makefile的区别

make 是个命令,是个可执行程序,用来解析 Makefile 文件的命令
makefile 是个文件,这个文件中描述了项目资源的编译规则。

2. makefile

2.1 优点

  • 管理我们的源文件
  • 会检查每个源文件是否被修改 再次只会编译修改过的源文件(提高编译效率)

2.2 语法及使用

  • 语法:
[变量名 = 变量值]
[...]
目标1:依赖文件列表
<tab>编译命令1
<tab>编译命令2

目标2:依赖文件列表
<tab>编译命令1
<tab>编译命令2

目标3:依赖文件列表
<tab>编译命令1
<tab>编译命令2
...

解释:

1、目标:通常是要产生的文件名称,目标可以是可执行文件或其它 obj 文件,也可是一个动作的名称

2、依赖文件:是用来输入从而产生目标的文件一个目标通常有几个依赖文件(可以没有)

3、命令:make 执行的动作,一个规则可以含几个命令(可以没有)有多个命令时,每个命令占一行

例:

main:main.c
	gcc main.c -o main
clear:
	rm main

解释:其中 main 就是目标main.c 就是依赖文件gcc main.c -o main 就是命令

注意:

​ 当目标后面没有依赖文件,我们就将其称为假象目标

  • 使用:

在控制台输入 make 命令

注意:

  1. make 默认在工作目录中寻找名为 GNUmakefilemakefileMakefile 的文件作为 makefile 输入文件
  2. -f 可以指定以上名字以外的文件作为 makefile 输入文件
  3. 若使用 make 命令时没有指定目标,则 make 工具默认会实现 makefile 文件内的第一个目标,然后退出。

例:在控制台输入

1,输入make,默认执行makefile文件中第一个目标中命令
2,输入make 目标,执行makefile文件中指定的目标中的命令
3,当makefile的文件名不是GNUmakefile、makefile、Makefile时,可以输入make -f 文件名,指定makefile文件
  • 再次执行只会编译修改过的文件

各文件如下:

在这里插入图片描述

通过命令行运行多个文件:

在这里插入图片描述

步骤:

步骤1:编写makefile文件如下

main:main.o myutils.o
	gcc main.o myutils.o -o main
clear:
	rm main *.o

步骤2:执行make命令查看,如下

在这里插入图片描述

步骤3:修改main.c文件,在次执行make命令

在这里插入图片描述

2.3 变量

2.3.1 分类
  • 系统变量:
由系统提供的变量
	make工具会拷贝系统的环境变量并将其设置为 makefile 的变量,在 makefile中可直接读取或修改拷贝后的变量。
查看系统变量命令:
	env
修改或添加系统变量
	export 变量名=值
	注意
		export是导入的意思

注意:

  • 只是临时修改,当dos关闭后,将不在存在
  • 如:makefile编写如下
main:main.o myutils.o
	gcc main.o myutils.o -o main
clear:
	rm main *.o
myprint:
	echo ${PWD}
  • 自定义变量(重点)

    程序员在编写makefile文件中自定义的变量

  • 预定义变量(重点)

    make命令提供的变量

2.3.2 自定义变量

语法:

定义变量:变量名=变量值
引用变量:$(变量名)或${变量名}

注意:

1、makefile 的变量名:makefile 变量名可以以数字开头

2、变量是大小写敏感的

3、变量一般都在 makefile 的头部定义

4、变量几乎可在 makefile 的任何地方使用

例:

EXEc = main
OBJ = main.o utils.o
FLAGS = -Wall -g		
cc = gcc

$(EXEc):$(OBJ)
	$(cc) $(OBJ) -o $(EXEc) $(-Wall -g)
main.o:main.c
	$(cc) -c main.c -o main.o
utils.o:utils.c
	$(cc) -c utils.c -o utils.o
clear:
	rm $(EXEc) *.o
  • 引用变量:定义的变量 在下面用 $()${} 替换
  • -Wall -g:忽略所有警告
2.3.3 预定义变量
makefile 中有许多预定义变量,这些变量具有特殊的含义,可在 makefile 中直接使用。
    $@ 目标名
    $< 依赖文件列表中的第一个文件
    $^ 依赖文件列表中除去重复文件的部分
    
以下为了解
    AR 归档维护程序的程序名,默认值为 ar
    ARFLAGS 归档维护程序的选项
    AS 汇编程序的名称,默认值为 as
    ASFLAGS 汇编程序的选项
    cc c 编译器的名称,默认值为 gcc
    cFLAGS c 编译器的选项
    cPP c 预编译器的名称,默认值为$(cc) -E
    cPPFLAGS c 预编译的选项
    cXX c++编译器的名称,默认值为 g++
    cXXFLAGS c++编译器的选项

如:

EXEc = main
OBJ = main.o utils.o
FLAGS = -Wall -g
cc = gcc

$(EXEc):$(OBJ)
	$(cc) $^ -o $@ $(-Wall -g)
#%:统配符
%.o:%.c
	$(cc) -c $< -o $@
clear:
	rm $(EXEc) *.o

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

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

相关文章

【Linux】在vim中批量注释与批量取消注释

在vim编辑器中&#xff0c;批量注释和取消注释的操作可以通过进入V-BLOCK模式、选择要注释或取消注释的内容、输入注释符号或选中已有的注释符号和按键完成。这些操作可以大大提高代码或文本的编写和修改效率&#xff0c;是vim编辑器中常用的操作之一。 1.在vim中批量注释的步…

Ubuntu22.04添加用户

一、查看已存在的用户 cat /etc/passwd 二、添加用户 sudo adduser xxx 除了密码是必须的&#xff0c;其他的都可以不填&#xff0c;直接回车即可 三、查看添加的用户 cat /etc/passwd 四、将新用户添加到sudo组 sudo adduser xxx sudo 五、删除用户 sudo delus…

线上业务优化之案例实战

本文是我从业多年开发生涯中针对线上业务的处理经验总结而来&#xff0c;这些业务或多或少相信大家都遇到过&#xff0c;因此在这里分享给大家&#xff0c;大家也可以看看是不是遇到过类似场景。本文大纲如下&#xff0c; 后台上传文件 线上后台项目有一个消息推送的功能&#…

Windows11安装python模块transformers报错Long Path处理

Windows11安装python模块transformers报错&#xff0c;报错信息如下 ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory: C:\\Users\\27467\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\Local…

四. 基于环视Camera的BEV感知算法-BEVDet

目录 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章——基于环视Cam…

Spring IoCDI

文章目录 一、Spring、Spring boot、Spring MVC之间的区别1. Spring 是什么2. 区别概述 一、Spring、Spring boot、Spring MVC之间的区别 1. Spring 是什么 Spring 是包含了众多工具方法的 IoC 容器 &#xff08;1&#xff09;容器 容器是用来容纳某种物品的基本装置&#xf…

DevEco Studio无法识别本地模拟器设备的解决方法

遇到了一个问题&#xff0c;之前测试无误的本地模拟器&#xff0c;运行后设备栏中无法识别了。 此时保持模拟器处于开启状态&#xff0c;关闭DevEco Studio窗口重新启动后&#xff0c;发现重新识别设备了。

vue项目中 CDN 是vue本身的依赖可以按需加载还是项目中所有的第三方库都可以按需加载?

这是我看到CDN简介时产生的问题 相信很多小伙伴会有 和我一样的疑问 在这里 我也统一回答一下 CDN&#xff08;内容分发网络&#xff09;是一种通过将数据分发到全球各个节点&#xff0c;以提供快速、可靠的内容传输的技术。在Vue项目中&#xff0c;CDN可以用于按需加载Vue本…

c语言中的static静态(1)static修饰局部变量

#include<stdio.h> void test() {static int i 1;i;printf("%d ", i); } int main() {int j 0;while (j < 5){test();j j 1;}return 0; } 在上面的代码中&#xff0c;static修饰局部变量。 当用static定义一个局部变量后&#xff0c;这时局部变量就是…

【TB作品】51单片机,具有报时报温功能的电子钟

2.具有报时报温功能的电子钟 一、功能要求: 1.显示室温。 2.具有实时时间显示。 3.具有实时年月日显示和校对功能。 4.具有整点语音播报时间和温度功能。 5.定闹功能,闹钟音乐可选。 6.操作简单、界面友好。 二、设计建议: 1.单片机自选(C51、STM32或其他单片机)。 2.时钟日历芯…

L1-047:装睡

题目描述 你永远叫不醒一个装睡的人 —— 但是通过分析一个人的呼吸频率和脉搏&#xff0c;你可以发现谁在装睡&#xff01;医生告诉我们&#xff0c;正常人睡眠时的呼吸频率是每分钟15-20次&#xff0c;脉搏是每分钟50-70次。下面给定一系列人的呼吸频率与脉搏&#xff0c;请你…

智能优化算法应用:基于松鼠算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于松鼠算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于松鼠算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.松鼠算法4.实验参数设定5.算法结果6.参考文献7.MA…

qt实现基本文件操作

先通过ui界面实现基本框架 接下来就要实现每个按键的功能了 我们先来实现新建的的功能&#xff0c;我们右键新建键&#xff0c;可以发现没有转到槽的功能&#xff0c;因此我们要自己写connect来建立关系。 private slots:void newActionSlot(); 在.h文件中加上槽函数。 conne…

PMP项目管理 - 风险管理

系列文章目录 PMP项目管理 - 质量管理 PMP项目管理 - 采购管理 PMP项目管理 - 资源管理 PMP项目管理 - 风险管理 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in…

常见Appium相关问题及解决方案

问题1&#xff1a;adb检测不到设备 解决&#xff1a; 1.检查手机驱动是否安装&#xff08;win10系统不需要&#xff09;&#xff0c;去官网下载手机驱动或者电脑下载手机助手来辅助安装手机驱动&#xff0c;安装完成后卸载手机助手&#xff08;防止接入手机时抢adb端口造成干…

【教3妹学编程-算法题】找到 Alice 和 Bob 可以相遇的建筑

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 3妹&#xff1a;好冷啊&#xff0c; 冻得瑟瑟发抖啦 2…

SpringBoot 源码解析2:启动流程1

SpringBoot 源码解析2&#xff1a;启动流程1 1.启动方式2.SpringBootApplication3.SpringApplication3.1 构造器SpringApplication3.2 SpringApplication#run 3.3 SpringApplication#run 中关键方法3.1 SpringApplication#prepareEnvironment3.2 SpringApplication#prepareCont…

CSS篇之圆角梯形

附上一篇文章&#xff1a;梯形tab按钮-基于clip-path path函数实现 - JSRUN.NET 他这个区别在于&#xff0c;收尾两侧都是直角的&#xff0c;如图 下面这个是圆角&#xff1a; 思路&#xff1a; 代码如下&#xff1a; <template><div class"wrap"><…

什么是Vue?

什么是Vue 什么是Vue&#xff1f;Vue 快速入门常用指令生命周期生命周期介绍生命周期 函数调用情况 什么是Vue&#xff1f; Vue 快速入门 常用指令 生命周期 生命周期介绍 生命周期 函数调用情况

Lit官方入门示例

陈拓 2023/12/17-2023/12/17 1. 简介 在《用Vite构建Lit项目》 https://blog.csdn.net/chentuo2000/article/details/134831884?spm1001.2014.3001.5501 一文中我们介绍了怎样用Vite构建Lit项目。 本文我们介绍不依赖Vite的Lit入门示例。 我的开发环境还是和上文相同。 …
最新文章