当前位置: 首页 > 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

http://www.lryc.cn/news/167522.html

相关文章:

  • 【PickerView案例08-国旗搭建界面加载数据 Objective-C预言】
  • 2023-09-15力扣每日一题
  • 系列七、Nginx负载均衡配置
  • Python爬虫(二十)_动态爬取影评信息
  • 基于 Flink CDC 高效构建入湖通道
  • redis的基础底层篇 zset的详解
  • 数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC...
  • Open3D(C++) 点云旋转的轴角表示法和罗德里格斯公式
  • CPU的三级缓存
  • pgzrun 拼图游戏制作过程详解(6,7)
  • laravel框架 - 集合篇
  • [npm]package.json文件
  • 联表查询 索引 事务 JDBC使用 CPU工作原理 线程概念 Thread类的用法
  • 学习格式化dedecms模版里格式化时间标签pubdate的方法
  • 用思维导图了解《骆驼祥子》的内容
  • js 不同域iframe 与父页面消息通信
  • c++ vs2019 cpp20规范 模板function 源码解析
  • 点云从入门到精通技术详解100篇-从全局到局部的三维点云细节差异分析(下)
  • 微信小程序中 vant weapp 使用外部的icon作为图标的步骤
  • [npm]脚手架本地全局安装1
  • 2023学习计划
  • 网络编程(一):服务器模型、Java I/O模型、Reactor事件处理模型、I/O复用
  • flyway适配高斯数据库
  • LVS keepalived实现高可用负载群集
  • HTTP RESTFul RPC
  • 短视频seo矩阵系统源码开发搭建--代用户发布视频能力
  • 真实的产品开发中,后端的设计规约可以写哪些
  • Pytorch 多卡并行(2)—— 使用 torchrun 进行容错处理
  • Java异常处理(详解)
  • 嵌入式-数据进制之间的转换