Makefile 快速入门

news2024/11/23 22:47:04

参考自:Makefile 20分钟入门,简简单单,展示如何使用Makefile管理和编译C++代码_哔哩哔哩_bilibili

注: 视频中用的是C++,博主这里用C语言实现

喜欢老师的于老师的还请多多点赞,觉得博主写得不错的,也可以点赞、收藏哦

本文我们将用四个版本的makefile文件带你入门

文件准备: 

 一个 空的文件夹下面 存放以下文件 :

除了Makefile文件,其他文件基本不改动(可能会加上几个空格 --> 修改编辑时间)

hello.c

jic.c

func.h

main.c 

接下来让我们来修改一下makefile文件吧

版本一:

VERSUION 1


hello : main.c hello.c jic.c
    gcc -o hello main.c hello.c jic.c

解读: 


hello: 生成这个目标


hello.c jic.c   --  目标的依赖文件
    gcc -o hello main.c hello.c jic.c --   命令 ,注意tab 开头,后续接着执行的命令


------------------------

编译

编译一次结果:


这时候 马上编译的话就 报错  -- 如图

是因为我们 的 生成的 hello 已经 很新了,比他的所有依赖文件都要新, 没必要进行make了
if此时末尾修改以下其他依赖文件 -- 那么他 就不是最新的 就口语make了,如下图
 

========================、

版本二

特点 -- 写得更加的注重makefile格式  

选项  -c 编译或汇编源文件,但不链接  -- 生成.o 文件

# VERSUION 2  

CC = gcc
TARGET = hello
OBJ = main.o hello.o jic.o

$(TARGET): $(OBJ)
    $(CC) -o $(TARGET) $(OBJ)


main.o:main.c
    $(CC) -c main.c

hello.o:hello.c
    $(CC) -c hello.c

jic.o:jic.c
    $(CC) -c jic.c    

编译

编译结果:

假如我们此时去修改 其中一个依赖文件 ,  会发现他只会去编译 被修改的文件,比如我们修改 jic.c, 如下图 只会 -c  编译jic.c


 优势 

  这样可以节约编译 时间

------------------------------------

 版本三: 

版本三和版本四是代码上的优化,这里就不演示编译了


# VERSION3

CC = gcc
TARGET = hello
OBJ = main.o hello.o jic.o

CCFLAGS = -c -Wall

$(TARGET): $(OBJ)
    $(CC) -o $@ $^

%.o : %.c
    $(CC) $(CCFLAGS) $< -o $@

.PHONY: clean
clean: 
    rm -f *.o $(TARGET)


-----------------------------------

解读:

 添加一个变量去存放他的选项  -->  CCFLAGS = -c -Wall
-Wall  --> 把所有的文件中的警告都输出 ,不加的话会 忽略掉一些小的警告
$(CC) -o $@ $^

 $^ --   所有依赖文件  -- main.c hello.c jic.c
$@  -- 生成目标文件  --    hello 

%.o : %.c
    $(CC) $(CCFLAGS) &< -o &@

//  % --> 通配符 把所有的依赖 .c文件 -- 匹配到
 &< -- 上一个依赖文件 对应我们这里的  %.c 
$(CC) $(CCFLAGS) &< -o &@  --> gcc -c -Wall  main.o hello.o jic.o -o hello  

 .PHONT clean 的作用  --> 防止文件目录下面 有一个文件叫clean  ,
如图,这是没加的时候,并且有clean这个文件的情况,会执行失败

如果想更详细了解这些函数的请看这篇: Makefile 规则-CSDN博客

优势

更加模块化 

后续要添加文件 就在,前面复赋值那里加  OBJ = main.o hello.o jic.o

=====================

版本四


#VERSION4


CC = gcc
TARGET = hello
SRC = $(wildcard *.c)
OBJ = $(patsubst %.c,%.o,$(SRC))

CCFLAGS = -c -Wall

$(TARGET): $(OBJ)
    $(CC) -o $@ $^

%.o : %.c
    $(CC) $(CCFLAGS) $< -o $@

.PHONY: clean
clean: 
    rm -f *.o $(TARGET)


----------------------------------

 优势

运用到函数大大优化代码,包括


SRC = $(wildcard *.c)  -- 通用匹配函数 让我们新加文件也不用修改Makefile

OBJ = $(patsubst %.c,%.o,$(SRC)) -- 替换函数,避免了手动输入

好的,看到这里相信你已经对makefile有了一定了解,关系你入门了makefile
想要更多的去进阶请看这篇: Makefile 规则-CSDN博客


 

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

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

相关文章

面对网络安全,做好风险评估对企业会带来哪些帮助

随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;成为企业不容忽视的重要议题。企业作为社会经济活动的主要参与者&#xff0c;其网络安全不仅关系到自身的生存与发展&#xff0c;更与国家的经济安全、社会稳定息息相关。因此&#xff0c;企业必须高度重视…

UG NX二次开发(C#)-去掉模型更新的警报提示窗口

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1、前言2 、解决方案 1、前言 在我的微信群《UG NX二次开发学习讨论》中有个群友发出一个问题&#xff0c;就是参数化模型修改后&#xff0c;有时更新是正确的&…

STM32开启停止模式,用外部中断唤醒程序运行

今天学习了一下STM32的停止模式&#xff0c;停止模式下&#xff0c;所有外设的时钟和CPU的电源都会被关闭&#xff0c;所以会很省电&#xff0c;打破这种停止模式的方式就是外部中断可以唤醒停止模式。要想实现这个功能&#xff0c;其实设置很简单的&#xff0c;总共就需要两步…

【数据结构初阶】时间复杂度和空间复杂度详解

今天我们来详细讲讲时间复杂度和空间复杂度&#xff0c;途中如果有不懂的地方可翻阅我之前文章。 个人主页&#xff1a;小八哥向前冲~-CSDN博客 数据结构专栏&#xff1a;数据结构【c语言版】_小八哥向前冲~的博客-CSDN博客 c语言专栏&#xff1a;c语言_小八哥向前冲~的博客-CS…

OceanBase 助力同方智慧能源,打造安全可靠、高性能的能源数据架构

本文作者&#xff1a;丁泽斌&#xff0c;同方智慧能源数据库工程师 业务背景 作为同方股份有限公司旗下的领军企业&#xff0c;同方智慧能源集团矢志成为全球领先的综合智慧能源解决方案提供商。凭借中核集团和清华大学的科技实力&#xff0c;专注于向建筑、交通、工业、北方供…

Linux工具篇 之 vim概念 操作 及基础指令讲解

学校不大 创造神话 讲桌两旁 陨落的王 临时抱佛脚 佛踹我一脚 书山有路勤为径 游戏玩的很起劲 想要计算机学的好&#xff0c;我的博客列表是个宝 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀–❀–❀–❀…

linux的lcd屏幕调试

x2600-lcd的sat101cp50d24b1屏幕的驱动调试 1.硬件关联 屏幕型号&#xff1a;sat101cp50d24b1 原理图&#xff1a; 很显然&#xff0c;这是RGB666显示格式的屏幕&#xff0c;RGB管脚DATA0-DATA17--为数据线 DEN 数据使能线。 VSYNC 垂直同步信号线。 HSYNC 水平同步信号线。…

vue-print-nb插件来实现打印功能——打印布局及尺寸处理

之前写过一篇文章是关于vue-print-nb插件实现打印功能&#xff0c; vue插件——vue-print-nb 实现打印功能:http://t.csdnimg.cn/ahuxp 但是在实际使用过程中&#xff0c;打印的效果不尽如人意。下面把打印页面和遇到的问题做一下汇总&#xff1a; 1.html代码——给打印元素绑…

vivado Aurora 8B/10B IP核(6)-本地流量控制(Native Flow Control)

Aurora 8B/10B 协议包括本地流控制&#xff08;NFC&#xff09;接口&#xff0c;其允许接收机通过指定必须 放入数据流的空闲数据跳数来控制接收数据的速率。 甚至可以通过请求发送器临时发送空闲&#xff08;XOFF&#xff09; 来完全关闭数据流.NFC 通常用于防止 FIFO 溢出条…

Python | Leetcode Python题解之第52题N皇后II

题目&#xff1a; 题解&#xff1a; class Solution:def totalNQueens(self, n: int) -> int:def backtrack(row: int) -> int:if row n:return 1else:count 0for i in range(n):if i in columns or row - i in diagonal1 or row i in diagonal2:continuecolumns.add…

【Unity基础】TextMeshPro组件学习过程记录

目录 1.TextMeshPro组件渲染创建文本RTL Editor字体Font Asset字体加粗&#xff0c;下划线等字体大小控制字体颜色控制字体渐变控制字符间隔、单词间隔、行间距、段落间距控制WrappingUV映射控制代码 2.TextMeshPro组件AssetFace InfoGeneration Setting 3.使用Dynamic SDF Sys…

Java基础_JDBC

JDBC 概述步骤项目创建流程代码改进 使用Statement的问题&#xff1a;SQL注入&#xff08;1&#xff09;SQL注入&#xff08;2&#xff09;PreparedStatement1、防止SQL注入2、批处理 事务连接池建立数据库连接实现 日志 概述 Java数据库连接&#xff0c;&#xff08;Java Dat…

机器学习:驱动现代交通运输革命的AI智慧引擎

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

POCEXP编写—多线程

POC&EXP编写—多线程 1. 前言2. 多进程&多线程2.1. 多进程2.1.1. 案例 2.2. 多线程2.2.1. 案例&#xff1a; 2.3. POC的案例&#xff08;模板&#xff09; 3. UA头设置3.1. 随机UA头3.1.1. 案例3.1.2. 模板拼接 4. 代理Proxy4.1. 单代理案例4.2. 多代理案例4.2.1. 请求…

2024年最新linux安装harbor

linux安装harbor Harbor官方介绍这里就不照搬了&#xff0c;说直白点&#xff1a;Harbor就是私有的 Docker Hob 镜像仓库。 前置条件&#xff1a;安装好docker,docker-compose 1、安装harbor离线包&#xff08;在线安装形式不稳定&#xff0c;由于网络原因中间可能中断&…

C++ 小游戏:战斗之旅

一、游戏名称&#xff1a;战斗之旅 游戏规则 角色选择&#xff1a;玩家可以选择不同的角色&#xff0c;每个角色都有不同的属性和技能。商城&#xff1a;玩家可以访问商城购买不同的装备&#xff0c;包括武器和回复物品。战斗&#xff1a;玩家可以与其他角色进行战斗。在战斗…

盲人定位设备:为视障人士独立出行铺设智慧之路

在快速发展的数字时代&#xff0c;科技的每一次跃进都在悄然改变我们的生活方式。对于盲人朋友而言&#xff0c;一款名为“蝙蝠避障”集实时避障于一身的盲人定位设备&#xff0c;正成为他们探索世界、实现独立出行的有力助手。这款设备&#xff0c;不仅重新定义了无障碍出行的…

YOLOv8+PyQt5输电线路缺陷检测(目前最全面的类别检测,可以从图像、视频和摄像头三种路径检测)

1.效果视频&#xff1a;YOLOv8PyQt5输电线路缺陷检测&#xff08;目前最全面的类别检测&#xff0c;可以从图像、视频和摄像头三种路径检测&#xff09;_哔哩哔哩_bilibili 资源包含可视化的输电线路缺陷检测系统&#xff0c;可识别图片和视频当中出现的五类常见的输电线路缺陷…

新书速览|ChatGLM3大模型本地化部署、应用开发与微调

实战文本生成、智能问答、信息抽取、财务预警应用开发&#xff0c;掌握ChatGLM3大模型部署、开发与微调技术 01 本书内容 《ChatGLM3大模型本地化部署、应用开发与微调》作为《PyTorch 2.0深度学习从零开始学》的姊妹篇&#xff0c;专注于大模型的本地化部署、应用开发以及微…

Linux基本指令(3)

目录 时间相关的指令&#xff1a; 1.在显示方面&#xff0c;使用者可以设定欲显示的格式&#xff0c;格式设定为一个加好后接数个标记&#xff0c;其中常用的标记列表如下&#xff1a; 2.在设定时间方面&#xff1a; 3.时间戳&#xff1a; Cal指令&#xff1a; find指令&a…