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.cgcc 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.ogcc 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.ogcc 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 归档维护程序的程序名,默认值为 arARFLAGS 归档维护程序的选项AS 汇编程序的名称,默认值为 asASFLAGS 汇编程序的选项cc c 编译器的名称,默认值为 gcccFLAGS c 编译器的选项cPP c 预编译器的名称,默认值为$(cc) -EcPPFLAGS 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.hqwc.cn/news/282199.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++软件调试与异常排查技术从入门到精通学习路线分享

目录 1、概述 2、全面了解引发C软件异常的常见原因 3、熟练掌握排查C软件异常的常见手段与方法 3.1、IDE调试 3.2、添加打印日志 3.3、分块注释代码 3.4、数据断点 3.5、历史版本比对法 3.6、Windbg静态分析与动态调试 3.7、使用IDA查看汇编代码 3.8、使用常用工具分…

连锁管理系统是什么?有哪些功能?

连锁管理系统帮助门店实现POS收银管理、门店管理、采购订货管理、线上商城搭建、供应链管理一体化管理系统&#xff0c;快速提高门店管理效率&#xff0c;无论你的门店有多少&#xff0c;连锁总部都能通过系统随时洞察监管门店的所有运营数据。 连锁管理系统由&#xff1a;1个…

【线性代数】期末速通!

1. 行列式的性质 1.1 求一个行列式的值 特殊地&#xff0c;对角线左下全为0&#xff0c;结果为对角线乘积。行 r 列 c 1.2 性质 某行&#xff08;列&#xff09;加上或减去另一行&#xff08;列&#xff09;的几倍&#xff0c;行列式不变某行&#xff08;列&#xff09;乘 …

使用Jemeter对HTTP接口压测

我们不应该仅仅局限于某一种工具&#xff0c;性能测试能使用的工具非常多&#xff0c;选择适合的就是最好的。笔者已经使用Loadrunner进行多年的项目性能测试实战经验&#xff0c;也算略有小成&#xff0c;任何性能测试&#xff08;如压力测试、负载测试、疲劳强度测试等&#…

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

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

【FPGA】Verilog:编码器 | 实现 4 到 2 编码器

0x00 编码器&#xff08;Encoder&#xff09; 编码器与解码器相反。当多台设备向计算机提供输入时&#xff0c;编码器会为每一个输入生成一个与设备相对应的信号&#xff0c;因此有多少比特就有多少输出&#xff0c;以数字形式表示输入的数量。 例如&#xff0c;如果有四个输…

基于junit4搭建自定义的接口自动化测试框架

随着业务的逐步稳定&#xff0c;对于接口的改动也会逐渐变少。更多的是对业务逻辑的优化&#xff0c;功能实现的完善。对于测试来说&#xff0c;重复繁琐的功能测试不仅效率低下&#xff0c;而且耗费一定的人力资源。笔者支持的信息流业务下的一个图文管理平台就是一个功能较为…

Java解决不同路径问题

Java解决不同路径问题 01 题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少…

秋招上岸记录咕咕咕了。

思考了一下&#xff0c;感觉并没有单独写这样一篇博客的必要。 能够写出来的&#xff0c;一些可能会对人有帮助的东西都做进了视频里面&#xff0c;未来会在blbl发布&#xff0c;目前剪辑正在施工中&#xff08;&#xff1f;&#xff09; 另外就是&#xff0c;那个视频里面使…

「Leetcode」滑动窗口—无重复字符的最长子串

&#x1f4bb;文章目录 &#x1f4c4;题目✏️题目解析 & 思路&#x1f4d3;总结 &#x1f4c4;题目 3. 无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字…

小程序开发使用vant库

初始化项目步骤就不做阐述。 第一步&#xff1a;安装依赖 vant/weapp npm下载命令&#xff1a;npm i vant/weapp -S --production npm下载命令&#xff1a;yarn add vant/weapp -S --production 第二步 &#xff1a;修改配置 1、找到miniprogram文件下的app.json 将 app.j…

排序-归并排序与计数排序

文章目录 一、归并排序1、概念2、过程3、代码实现4、复杂度5、稳定性 二、 计数排序1、思路2、代码实现3、复杂度&#xff1a;4、稳定性 一、归并排序 1、概念 是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已…