如何系统地学习 Makefile 相关的知识(读/写)? 您所在的位置:网站首页 makefile和makefileam区别 如何系统地学习 Makefile 相关的知识(读/写)?

如何系统地学习 Makefile 相关的知识(读/写)?

2023-03-22 10:52| 来源: 网络整理| 查看: 265

Makefile其实不难学,对于一些基本概念百度上应该很多,这里分享一个循序渐进的学习方式,保证让你快速掌握Makefile的编写。

本文首发于公众号:良许Linux,里面有一个 Makefile 系列,欢迎关注交流!

另外,想进大厂的同学,仅仅学会Makefile是不够的,一定要好好学算法,这是面试必备的。这里准备了一份 BAT 大佬总结的 LeetCode 刷题宝典,很多人靠它们进了大厂。

1. 前言

通过之前章节的学习,我们对Makefile有个基础的认识,现在开始自己动手写Makefile。

目前网络上有不少可以自动生成Makefile的工具,但很多项目其实没必要那么复杂,完全可以自己动手写出来。

而且对于初学者来说,自己动手写一遍Makefile可以顶看十遍高手写的Makefile,也可以加深对Makefile的理解,将来公司的Makefile有需要修改的时候自己就可以动手搞定,不需要依靠他人,何乐而不为?

2. 源代码介绍

在本教程中用于示例的代码很简单,仅仅是在main函数中调用了fun1及fun2函数,而fun1及fun2独立写在fun1.c及fun2.c里。代码如下:

//main.c int main() { printf("hello world\n"); fun1(); fun2(); } //fun1.c void fun1() { printf("this is fun1\n"); } //fun2.c void fun2() { printf("this is fun2\n"); }

3. 第一版Makefile

对于我们的示例代码,不通过Makefile编译其实也很简单:

gcc main.c fun1.c fun2.c -o app

我们知道,Makefile其实就是按规则一条条的执行。所以,我们完全可以把上面那条命令写成Makefile的一个规则。我们的目标是app,按此写法依赖是main.c fun1.c fun2.c,则最终的Makefile如下:

app: main.c fun1.c fun2.c gcc main.c fun1.c fun2.c -o app

但这个版本的Makefile有两个很重要的不足:

对于简单代码还好,而对于大型项目,具有成千上万代码来说,仅用一行规则是完全不够的,即使够的话也需要写很长的一条规则;任何文件只要稍微做了修改就需要整个项目完整的重要编译。

基于此,我们在第一版的基础上优化出第二版。

4. 第二版Makefile

在第二版Makefile中,为了避免改动任何代码就需要重新编译整个项目的问题,我们将主规则的各个依赖替换成各自的中间文件,即main.c --> main.o,fun1.c --> fun1.o,fun2.c --> fun2.o,再对每个中间文件的生成各自写条规则比如对于main.o,规则为:

main.o: main.c • gcc -c main.c -o main.o

这样做的好处是,当有一个文件发生改动时,只需重新编译此文件即可,而无需重新编译整个项目。完整Makefile如下:

app: main.o fun1.o fun2.o gcc main.o fun1.o fun2.o -o app ​ main.o: main.c gcc -c main.c -o main.o ​ fun1.o: fun1.c gcc -c fun1.c -o fun1.o ​ fun2.o: fun2.c gcc -c fun2.c -o fun2.o

第二版Makefile同样具有一些缺陷:

里面存在一些重复的内容,可以考虑用变量代替;后面三条规则非常类似,可以考虑用一条模式规则代替。

基于此,我们在第二版的基础上优化出第三版。

5. 第三版Makefile

在第三版Makefile中,我们使用变量及模式规则使Makefile更加简洁。使用的三个变量如下:

obj = main.o fun1.o fun2.o target = app CC = gcc

使用的模式规则为:

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

这条模式规则表示:所有的.o文件都由对应的.c文件生成。在规则里,我们又看到了两个自动变量:$

对应书单:

附:近期高赞回答

Linux的功能有多强大?学习Linux有没有比《鸟哥的Linux私房菜》更好的书?有没有学习Linux比较好的入门书籍?

码字不易,硬核码字更难,希望大家不要吝啬自己的鼓励。我是:

@程序员良许

欢迎关注我!

我的个人网站,满满的都是Linux干货:良许Linux教程网

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有