当前位置: 首页 > news >正文

Makefile基础

aebc6691058db74d0f96bb43d04caa4d.png

迷途小书童

读完需要

4

分钟

速读仅需 2 分钟

1

   

引言

下面这个 C 语言的代码非常简单

#include <stdio.h>int main()
{printf("Hello World!.\n");return 0;
}

在 Linux 下面,我们使用下面的命令编译就可以

gcc hello.c -o hello

但是随着项目的变大,势必会有越来越多的 .c 文件和 .h 头文件,再直接使用编译器指令就非常麻烦了,光输入文件名都会影响心情,而且还非常容易出错,比如下面的例子

gcc hello.c aaa.c bbb.c -lpthread -ltest1 -ltest2 -o hello

而且哪怕你只是修改一个文件,也需要重新编译所有的文件,白白浪费了很多的开发时间。要解决这个问题,最好的方式就是把工程的编译规则写下来,让编译器自动加载规则去进行编译。

要实现上述目标,需要 2 个工具,make 和 Makefile,它们是搭配使用的,各司其职

  • make:它可以帮助我们找出项目里面修改变更过的文件,并根据依赖关系,找出受修改影响的其他相关文件,然后对这些文件按照规则进行单独的编译,这样一来,就能避免重新编译项目的所有的文件。

  • Makefile:定义编译的规则、依赖关系,make 工具就能精准地进行编译工作

2

   

Makefile 是什么

Makefile 是用于指定软件编译、链接的构建过程的文件,一般位于软件源代码的根目录下。通过定义一系列的规则,Makefile 告诉 make 工具应该如何编译和链接代码生成最终的可执行文件或库文件。

3

   

Makefile 基本语法

Makefile 由一系列 rule 组成,rule 的基本格式是

target:prerequisites
command

这里,target 是所要生成的文件,prerequisites 是生成该 target 所依赖的文件或目标,command 是实际执行的命令。

4

   

Makefile 示例

下面是一个简单的示例

app: main.o add.ogcc main.o add.o -o appmain.o: main.cgcc -c main.cadd.o: add.cgcc -c add.c

这段 Makefile 包含了 3 个 rule,它指定了 app 依赖 main.o 和 add.o,后两个又依赖各自的源码文件。make 将自动根据依赖关系完成编译。

所以,这时候的编译命令就变的非常简单,直接输入 make 即可生成可执行文件 app。

5

   

Makefile 常用知识点

在 Makefile 中可以定义变量,例如

objects = main.o kbd.o command.o display.oprog: $(objects)cc $(objects) -o prog

使用 objects 变量表示多个目标文件,这样可以使语法更加简洁。

使用通配符可以批量指定一类目标,例如

.PHONY: clean
clean:rm *.o

这里使用 *.o 指定了所有 .o 文件为 clean 目标的依赖,这样 clean 时可以删除所有的 .o 文件。这里使用 .PHONY 声明伪目标,这些目标不对应实际文件。

一个规则也可以指定多个目标,例如

bigoutput littleoutput : text.ggenerate text.g -o bigoutputgenerate text.g -o littleoutput

上述例子中同时生成了 bigoutput 和 littleoutput。

使用静态模式可以在规则中引用目标名,例如

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

这个模式规则可以匹配所有的 .c 到 .o 的转换。

支持自定义函数,例如

upcase = $(subst a,A,$(1))a.o : a.c $(CC) -c $(call upcase,$<) -o $@

这里使用 upcase 函数将参数转换为大写。

6

   

免费社群

9bde390e39a70c40575abb912b5f2d42.jpeg

cfed9142e42600f518ce79d7bf4b246f.gif

相关文章:

Makefile基础

迷途小书童 读完需要 4分钟 速读仅需 2 分钟 1 引言 下面这个 C 语言的代码非常简单 #include <stdio.h>int main() {printf("Hello World!.\n");return 0; } 在 Linux 下面&#xff0c;我们使用下面的命令编译就可以 gcc hello.c -o hello 但是随着项目的变大…...

【PickerView案例08-国旗搭建界面加载数据 Objective-C预言】

一、来看我们第三个案例 1.来看我们第三个关于PickerView的一个案例, 首先呢,我要问大家一下, 咱们这个是几组数据呢, 这是一个pickerView,只不过,它显示的是什么,一个界面, 前面两个案例,都是文字 这个案例,开始有图片了, 总结一下这三个案例: 1)第一个案例…...

2023-09-15力扣每日一题

链接&#xff1a; [LCP 50. 宝石补给](https://leetcode.cn/problems/queens-that-can-attack-the-king/) 题意 略 解&#xff1a; 简单题 模拟 实际代码&#xff1a; int giveGem(vector<int>& gem, vector<vector<int>>& operations) {for(…...

系列七、Nginx负载均衡配置

一、目标 浏览器中访问http://{IP地址}:9002/edu/index.html&#xff0c;浏览器交替打印清华大学8080、清华大学8081. 二、步骤 2.1、在tomcat8080、tomcat8081的webapps中分别创建edu文件夹 2.2、将index.html分别上传至edu文件夹 注意事项&#xff1a;tomcat8080的edu文件…...

Python爬虫(二十)_动态爬取影评信息

本案例介绍从JavaScript中采集加载的数据。更多内容请参考:Python学习指南 #-*- coding:utf-8 -*- import requests import re import time import json#数据下载器 class HtmlDownloader(object):def download(self, url, paramsNone):if url is None:return Noneuser_agent …...

基于 Flink CDC 高效构建入湖通道

本文整理自阿里云 Flink 数据通道负责人、Flink CDC 开源社区负责人&#xff0c; Apache Flink PMC Member & Committer 徐榜江&#xff08;雪尽&#xff09;&#xff0c;在 Streaming Lakehouse Meetup 的分享。内容主要分为四个部分&#xff1a; Flink CDC 核心技术解析数…...

redis的基础底层篇 zset的详解

一 zset的作用以及结构 1.1 zset作用 redis的zset是一个有序的集合&#xff0c;和普通集合set非常相似&#xff0c;是一个没有重复元素的字符串集合。常用作排行榜等功能&#xff0c;以用户 id 为 value&#xff0c;关注时间或者分数作为 score 进行排序。 1.2 zset的底层结…...

数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC...

全文链接:http://tecdat.cn/?p27384 在本文中&#xff0c;数据包含有关葡萄牙“Vinho Verde”葡萄酒的信息&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 介绍 该数据集&#xff08;查看文末了解数据获取方式&#xff09;有1599个观测值和12个变量&#xf…...

Open3D(C++) 点云旋转的轴角表示法和罗德里格斯公式

目录 一、算法原理1、轴角表示法2、罗德里格斯公式二、代码实现三、结果展示四、相关链接一、算法原理 1、轴角表示法 假设刚体坐标系为B(Oxyz)绕单位向量 ω ⃗ \vec{ω}...

CPU的三级缓存

CPU缓存&#xff08;Cache Memory&#xff09;是位于CPU与内存之间的临时存储器&#xff0c;它的容量比内存小的多但是交换速度却比内存要快得多。高速缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾&#xff0c;因为CPU运算速度要比内存读写速度快很多&#…...

pgzrun 拼图游戏制作过程详解(6,7)

6. 检查拼图完成 初始化标记成功的变量Is_Win Is_WinFalse 当鼠标点击小拼图时&#xff0c;判断所有小拼图是否都在正确的位置&#xff0c;并更新Is_Win。 def on_mouse_down(pos,button): # 当鼠标被点击时# 略is_win Truefor i in range(6):for j in range(4):Square S…...

laravel框架 - 集合篇

Laravel Eloquent 通常返回一个集合作为结果&#xff0c;集合包含很多有用的、功能强大的方法。 你可以很方便的对集合进行过滤、修改等操作。 本次教程就一起来看一看集合的常用方法及功能。 你可以使用助手函数 collect 将数组转化为集合。 $data collect([1, 2, 3]); 1…...

[npm]package.json文件

[npm]package.json文件 生成 package.jsonpackage.json 必须属性nameversion 描述信息descriptionkeywordsauthorcontributorshomepagerepositorybugs 依赖配置dependenciesdevDependenciespeerDependenciesoptionalDependenciesbundledDependenciesengines 脚本配置scriptscon…...

联表查询 索引 事务 JDBC使用 CPU工作原理 线程概念 Thread类的用法

第 1 题&#xff08;单选题&#xff09; 题目名称&#xff1a; 已知表T1中有2行数据&#xff0c;T2中有3行数据&#xff0c;执行SQL语句,“select a.* from T1 a,T2 b”后&#xff0c;返回的行数为 题目内容&#xff1a; A .2 B .3 C .5 D .6 第 2 题&#xff08;单选题…...

学习格式化dedecms模版里格式化时间标签pubdate的方法

学习格式化dedecms模版里格式化时间标签pubdate的方法 [field:pubdate function"GetDateTimeMK(me)"/][field:pubdate function"GetDateMK(me)"/][field:pubdate function"MyDate(Y-m-d H:i,me)"/]显示不同的时间样式&#xff1a; GetDateTimeMK…...

用思维导图了解《骆驼祥子》的内容

《骆驼祥子》是一部经典的中国小说&#xff0c;由著名作家老舍所创作。小说以北京城下贫苦的人们为背景&#xff0c;讲述了一个叫做祥子的年轻人&#xff0c;为了摆脱贫困和苦难&#xff0c;不断地奋斗和努力的故事。下面我们进行文字思维导图的方式来一起了解一下整个故事的内…...

js 不同域iframe 与父页面消息通信

不同域iframe 与父页面消息通信 &#x1f4a1;访问 iframe 页面中的方法&#x1f4a1;跨文本消息监听消息发送消息 var iframe document.getElementById("myIframe"); var iframeWindow iframe.contentWindow;&#x1f4a1;访问 iframe 页面中的方法 iframeWindow…...

c++ vs2019 cpp20规范 模板function 源码解析

以下是文字结论&#xff1a; 这个函数模板&#xff0c;可以把函数类型&#xff0c;和对象函数类型&#xff08;就是类里定义了operator()运算符函数&#xff09;统一成一个类型&#xff0c;反正都是可调用对象。 代码注释完有900行&#xff0c;也挺多的。选择最重要的结论贴出…...

点云从入门到精通技术详解100篇-从全局到局部的三维点云细节差异分析(下)

目录 5.2.3多层级点云细节差异对比 5.3从全局到局部的细节差异分析流程与结果 实验结果与分析...

微信小程序中 vant weapp 使用外部的icon作为图标的步骤

微信小程序中 vant weapp 使用外部的icon作为图标的步骤 1. 在项目中创建静态资源文件夹2. 前往iconfont图标官网&#xff0c;添加图标并拷贝在线链接3. 下载iconfont代码&#xff0c;解压之后拷贝到小程序的目录中4. 修改iconfont.wxss 将本地链接替换为在线链接5. 在项目的ap…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...