Makefile从零基础到入门到熟练使用

Makefile从零基础到入门到熟练使用

一、了解Makefile作用

1、一个文件从源码到可执行文件的过程:预处理-编译-汇编-链接
在这里插入图片描述
2、每个步骤都可以单独执行
在这里插入图片描述

在这里插入图片描述
3、使用过程中会压缩成两步
在这里插入图片描述
4、一步执行并且打印详细日志信息

gcc -o hello hello.c -v

5、有多个源码文件需要生成一个可执行文件

//分步执行
gcc -o a.o a.c
gcc -o b.o b.c
gcc -o c.o c.c
gcc -o hello a.o b.o c.o//一步执行
gcc -o hello a.c b.c c.c
二、引入Makefile规则

1、目标文件test依赖a.o和b.o两个文件,a.o依赖a.c文件,b.o依赖b.c文件
在这里插入图片描述

三、Makefile语法

1、通配符用法

%:表示任意),($@:目标),($<:第一个依赖),($^:所有依赖)

在这里插入图片描述
2、假想目标
正常情况下执行make clean是没有问题的,若文件目录下本来就有了clean文件,make clean就无法正常执行,所以要将Makefile中的clean设置成一个假想目标
在这里插入图片描述
3、延时变量(B = xxxx)、即时变量(A := xxxx)
在这里插入图片描述

注意:引用变量是用$(变量名),使用echo打印变量时,不想看到指令就在echo前加一个@符号
说明:打印结果是变量A打印为空,变量B打印为ABC
原因:变量A在定义的时候变量C还没定义所以是空,变量B是延时变量只要在用到的时候才会看变量C的值是多少
在这里插入图片描述

4、Makefile函数
说明:变量B会打印a.o b.o c.o
解释:foreach函数操作变量A中被空格隔开的字符都加上.o
在这里插入图片描述
说明:变量D会打印d/,变量E会打印a b c
解释:filter函数操作变量C中符合%/这种类型的字符,filter-out函数操作变量C中符合%/这种类型剩下的所有字符
在这里插入图片描述
说明:变量files会打印当前文件夹下所有的.c文件
解释:wildcard函数会查找当前文件夹下所有的.c文件,获取到所有的文件名
在这里插入图片描述
说明:变量dep_files会打印a.d b.d c.d e.d
解释:patsubst函数会操作files2中的所有文件名替换成a.d b.d c.d e.d
在这里插入图片描述
在这里插入图片描述

四、使用Makefile

1、一个基础的自动包含依赖的Makefile文件的规范写法
说明:
2行:变量objs中包含所有的依赖文件
4行:变量dep_files是获取到所有的依赖文件名字
5行:变量dep_files是获取到所有的真实存在的依赖文件的名字
7行:目标以及生成目标的所有依赖
8行:生成目标的指令
10行:判断依赖文件是否是空
11行:依赖文件不为空的话就包含进来
14行:所有的.c生成.o
15行:生成所有的.o文件并且生成所有的依赖文件
18行:清除编译文件
21行:清除依赖文件
在这里插入图片描述

objs = a.o b.o c.odep_files := $(patsubst %,.%.d, $(obis))
dep_files := $(wildcard $(dep_files))test: $(objs)gcc -o test $^ifneq ($(dep_files),)
include $(dep_files)
endif%.o:%.cgcc -c -o $@ $< -MD -MF .$@.dclean:rm *.o test
distclean:rm $(dep_files)
PHONY: clean

2、CFLAGS用法
说明:作为编译参数给gcc指令使用(把所有的警告当做错处处理)
在这里插入图片描述
设置默认头文件目录,这样在编译的时候会直接去include文件夹找头文件
在这里插入图片描述

在这里插入图片描述
说明:设置当前目录为头文件路径,这样的在使用头文件就可以写成#include<b.h>
在这里插入图片描述

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

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

相关文章

【小白专用】MySQL入门(详细总结)

3. 创建数据库 使用 create database 数据库名; 创建数据库。 create database MyDB_one; create database DBAliTest; 创建数据库成功后&#xff0c;数据库的数量变成了6个&#xff0c;多了刚才创建的 dbalitest 。 4. 创建数据库时设置字符编码 使用 create database 数据…

【文件上传系列】No.1 大文件分片、进度图展示(原生前端 + Node 后端 Koa)

分片&#xff08;500MB&#xff09;进度效果展示 效果展示&#xff0c;一个分片是 500MB 的 分片&#xff08;10MB&#xff09;进度效果展示 大文件分片上传效果展示 前端 思路 前端的思路&#xff1a;将大文件切分成多个小文件&#xff0c;然后并发给后端。 页面构建 先在页…

【算法题】拼接URL(js)

自己的解法&#xff1a; 2x2 种情况判断 function solution(urlStr) {const pre urlStr.split(",")[0];const after urlStr.split(",")[1];if (pre.endsWith("/")) {if (after.startsWith("/")) {return pre after.slice(1);} else…

如何跑AI模型—ultralytics

这里以跑 ultralytics 为示例&#xff0c;记录了如何从 0-1 跑个简单的模型&#xff0c;包括环境搭建。我的是 Window 系统&#xff0c;其他系统也类似。 主要流程是环境搭建&#xff0c;找个官网的 demo&#xff0c;收集好所需素材&#xff08;模型&#xff0c;图片等&#x…

“四位一体”引领企业数据治理新模式

数字化时代&#xff0c;数据作为新的生产要素受到了前所未有的关注和重视。 随着企业业务的发展&#xff0c;数据积累越来越多。怎么管理好数据&#xff1f;如何利用好数据&#xff1f;数据价值如何挖掘&#xff1f;成为很多企业面临的难题&#xff01; 面对这些棘手的问题&am…

做好这三点,有效提升项目的成功率

近期&#xff0c;大家都在做年度工作总结的准备了&#xff0c;在互相交流的时候&#xff0c;提到了一个值得思考的话题——“如何能提高项目的成功率&#xff1f;”。对于项目经理来说&#xff0c;都希望能找到一些通用的经验直接复制粘贴在自己的项目上&#xff0c;促进项目的…

鸿蒙原生应用开发【分布式数据对象】

01、什么是分布式数据对象 在可信组网环境下&#xff0c;多个相互组网认证的设备将各自创建的对象加入同一个 sessionId&#xff0c;使得加入的多个数据对象之间可以同步数据&#xff0c;也就是说&#xff0c;当某一数据对象属性发生变更时&#xff0c;其他数据对象会检测到这…

优秀软件测试工程师必备的“8个能力”

首先要说&#xff0c;做软件测试不难&#xff0c;难的是做好软件测试。 结合自己这些年的工作经验&#xff0c;自己也总结出来8个方面的能力&#xff0c;可能有些方面感觉要求暂时还达不到&#xff0c;但这些确实是做软件测试工作所必备的能力&#xff0c;掌握了这8个方面的能力…

Mybatis XML改查操作(结合上文)

"改"操作 先在UserInfoXMLMapper.xml 中 : <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><map…

vue使用甘特图dhtmlxgantt + gantt.addTaskLayer

效果图&#xff1a; 甘特图 官网地址 gantt安装与使用 vue版---部分功能收费 安装gantt 或 引入文件 npm install dhtmlx-gantt -save或import gantt from "/public/static/dhtmlxgantt/dhtmlxgantt.js"; import "/public/static/dhtmlxgantt/locale/local…

【银行测试】金融项目+测试方法范围分析,功能/接口/性能/安全...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、金融行业软件特…

spring-boot-starter-validation是什么Validation参数校验使用概要

spring-boot-starter-validation是什么&Validation参数校验使用概要 来源Valid和Validated的用法(区别)引入依赖Valid和Validated的用法 在日常的项目开发中&#xff0c;为了防止非法参数对业务造成的影响&#xff0c;需要对接口的参数做合法性校验&#xff0c;例如在创建用…