makefile 入门1

news/2025/9/19 17:19:51/文章来源:https://www.cnblogs.com/zxc-cppnb/p/19092880

目标

目标的语法非常简单

targets: prerequisites
    recipes
    ...
或者
targets: prerequisites ; recipes
    recipes
    ...

当执行目标时,make会检测prerequisites中的所有文件是否存在,如果都存在则执行targets后的recipes
recipes必须用制表符缩进。
例如:

main.o: main.cgcc -c main.c -o main.omain: main.ogcc main.o -o main

当你执行make main指令之后,make会查看main目标,发现需要一个main.o文件,如果当前目录有main.o则执行
gcc main.o -o main命令,否则会寻找main.o的目标,而main.o目标需要main.c文件,如果当前目录下有main.c
则执行gcc -c main.c -o main.o,这样生成main.o后进而执行main目标,当然main.c文件一般都是程序员编写的。
此外如果你在编译成功后再次,修改main.c文件,由于main.c文件比main.o新,再次执行make main时,会重新生成
main.o和main文件。
再看一个稍微复杂的例子:
现在有3个文件:main.c,tool.c,tool.h,它们都在同一目录下。

// main.c
#include <stdio.h>
#include "tool.h"int main(){print_hello();return 0;
}
// tool.c
#include <stdio.h>
#include "tool.h"void print_hello(){printf("hello world\n");
}
//tool.h
#ifndef TOOL_H
#define TOOL_Hvoid print_hello();#endif
#makefile
tool.o: tool.cgcc -c tool.c -o tool.omain.o: main.cgcc -c main.c -o main.omain: main.o tool.ogcc main.o tool.o -o main

如果成功编译以后,又修改了main.c但是没有修改tool.c,那么下次编译时只会执行main.o和main目标,这样就提高了编译效率
但是会发现这样的makefile写起来太麻烦了,比如tool.o目标需要tool.c接下来执行的代码大概率也会和tool.c相关,这样写了太多次
tool.c,通用性也不好,并且生成的目标也多写了一次。好在makefile有一些特殊变量可以解决这个问题:

$^ 当前目标的所有所需文件名
$@ 当前目标的目标名
$< 当前目标的所需文件中的第一个文件名

接下来,我们能把makefile写成这样:

#makefile
tool.o: tool.cgcc -c $^ -o $@main.o: main.cgcc -c $^ -o $@main: main.o tool.ogcc $^ -o $@

makefile脚本的解析过程

makefile是一个脚本语言但是它的解析过程有些不同,当执行make指令时,make会把makefile文件整体先替换一遍,变量的赋值和多目标生成在此步完成
第二次解析的时候才会执行脚本,这也是为什么编写目标的时候可以打乱顺序。

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

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

相关文章

详细介绍:【 C/C++ 算法】入门动态规划-----一维动态规划基础(以练代学式)

详细介绍:【 C/C++ 算法】入门动态规划-----一维动态规划基础(以练代学式)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

iOS 26 能耗检测实战指南 如何监测 iPhone 电池掉电、Adaptive Power 模式效果与后台耗能问题(uni-app 与原生 App 优化必看)

本文结合 iOS 26 新增的 Adaptive Power 模式与电池界面功能,介绍如何检测 iPhone 能耗问题(包括启动耗电、后台耗电、动画特效与资源加载耗电等),并结合 Instruments、克魔等工具给出 uni-app 项目的实战优化指南…

Transformer的个人理解

Transformer工作原理 分词 文本进来之后,首先经过Tokenizer(分词器)分割成很多个token。每个token都会赋予一个从0开始的ID,用于后续索引。 然后通过一个embedding层,将token转换成一个多维向量,也叫做embedding…

国标GB28181平台EasyGBS如何实现企业园区视频监控一体化管理?

国标GB28181平台EasyGBS如何实现企业园区视频监控一体化管理?企业园区安防系统面临多品牌设备兼容难、系统孤立、管理效率低等痛点。本文详细探讨基于国标GB28181协议的EasyGBS视频平台如何为企业园区提供完整的视频监…

360环视硬件平台为什么推荐使用米尔RK3576开发板?

在汽车智能化和智慧安防快速发展的今天,360环视系统 已成为保障行车与场景安全、提升体验的重要技术。无论是自动泊车、驾驶辅助,还是智慧社区监控,核心诉求都是能够接入 多路摄像头,并通过高效的 推流 实现低延迟…

C语言弱函数

C语言弱函数project/ ├── core/ │ └── system_init.c // 核心框架代码,包含弱函数 ├── boards/ │ └── my_board.c // 板级特定代码,提供强函数 └── main.c // 主程序 /…

高质量票据识别数据集:1000张收据图像+2141个商品标注,支持OCR模型训练与文档理解研究

​获取更多高质量数据集,请访问典枢数据交易平台:https://dianshudata.com/引言与背景 在数字化转型的浪潮中,票据识别技术已成为金融、零售、餐饮等行业自动化处理的核心技术。传统的票据处理依赖人工录入,效率低…

1202_InnoDB中一条UPDATE语句的执行流程

InnoDB中一条UPDATE语句的执行流程可以概括为以下步骤和图示:下面是每个步骤的详细说明: 第一步:连接器与权限验证 (Client → Server Layer)建立连接:客户端应用程序(如Java程序、MySQL CLI)与MySQL服务器建立连…

1201_mysql查询语句select执行流程

查询语句select执行流程,如下图所示,其核心流程可概括为: flowchart TD A["客户端提交 SELECT 语句"] --> B["连接器<br>管理连接, 权限验证"] B --> C["查询缓存<br>(…

记录---vue3项目实战 打印、导出PDF

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣 一 维护模板 1 打印模板:<template> <div class="print-content"> <div v-for="item in data.detailList" :key="…

node.js安装(绿色版)

1、官方下载,选择【独立文件(.zip)】下载https://nodejs.org/zh-cn/download/ 2、解压到C:\Program Files\nodejs3、在安装目录下创建以下两个目录node_global(默认:C:\Program Files\nodejs) node_cache(默认:C…

selenium完整版一览 - 教程

selenium完整版一览 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—开发环境搭建(二) - 创龙科技

本文围绕创龙科技研发的开发环境搭建需求,详细阐述了完整流程:先安装 VMware 16.2.5 虚拟机,再基于虚拟机部署 Ubuntu 20.04.6 系统,含系统配置、虚拟机工具安装及共享目录设置;还讲解了 GDB 10.2 调试工具的环境…

ctfshow web55

<?php/* # -*- coding: utf-8 -*- # @Author: Lazzaro # @Date: 2020-09-05 20:49:30 # @Last Modified by: h1xa # @Last Modified time: 2020-09-07 20:03:51 # @email: h1xa@ctfer.com # @link: https://ct…

ctfshow web58

<?php/* # -*- coding: utf-8 -*- # @Author: Lazzaro # @Date: 2020-09-05 20:49:30 # @Last Modified by: h1xa # @Last Modified time: 2020-09-07 22:02:47 # @email: h1xa@ctfer.com # @link: https://ct…

ctfshow web57

<?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-05 20:49:30 # @Last Modified by: h1xa # @Last Modified time: 2020-09-08 01:02:56 # @email: h1xa@ctfer.com # @link: https://ctfe…

详细介绍:【SQLMap】POST请求注入

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

ctfshow web52

2 <?php/* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-05 20:49:30 # @Last Modified by: h1xa # @Last Modified time: 2020-09-05 22:50:30 # @email: h1xa@ctfer.com # @link: https://ctf…