本章讲解知识点
-
- 引言
-
- Makefile
-
- Makefile 入门
- 本专栏适合于软件开发刚入职的学生或人士,有一定的编程基础,帮助大家快速掌握工作中必会的工具和指令。
- 本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。
- 如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习,共同进步。
- 相信大家都有着高尚的灵魂,请尊重我的知识产权,未经允许严禁各类机构和个人转载、传阅本专栏的内容。
1. 引言
家人们,我问大家一个问题,我们之前的教程都是针对一个源文件 douya.c 进行了无数种操作。当我们有多个文件时,怎么链接到一起最后形成一个执行文件呢?
当然我们也有简单的做法。
我们给出实例,我们创建两个 c 文件,一个 douya.c 和 max.c,douya.c 里 main 函数调用 max.c 里的 max 比较大小函数:
给出 max.c 内容:
#include <stdio.h>
#include "max.h"
int max(const int a, const int b){
return a > b ? a : b;
}
然后给出头文件 max.h,我们 extern 出 max 函数:
#ifndef MAX_H
#define MAX_H
extern int max(const int a, const int b);
#endif
最后我们给出 douya.c 内容:
#include <stdio.h>
#include "max.h"
int main(){
printf("Hello, Douya!\n");
int result = max(4, 6);
printf("the max value is %d: \n", result);
return 0;
}
1.好了,这里我们给出了一个简单例子,主要是为了说明多文件的编译、链接、执行。
然后我们输入
$ gcc -Wall douya.c max.c -o douya
该命令自动将两个文件编译、链接并生成执行文件,运行 ./douya
$ ./douya
Hello, Douya!
the max value is 6:
我们就实现了。
2.当然我们也可以单文件先各自生成目标文件,最后链接成可执行文件。
如下:
$ gcc -c douya.c -o douya.o
这里的 -c 就表示只执行到汇编这一步而不链接,生成目标文件 douya.o;max.c 文件同理生成 max.o,最后我们将两个目标文件链接起来生成可执行文件。大家关于程序编译的四个步骤,你可没忘吧?
$ gcc -c douya.c -o douya.o
$ gcc -c max.c -o max.o
$ gcc max.o douya.o -o douya
$ ./douya
Hello, Douya!
the max value is 6:
肯定有家人会说了,一个工程项目往往几十个源文件,难道还要一一编译再链接?那也太麻烦了吧!
确实很麻烦,所以我们引入今天的正题。
2. Makefile
2.1. 什么是 Makefile
我们要引出一个重要内容——Makefile。Makefile 是一种常用于编译的脚本语言。它可以更好更方便的管理你的项目的代码编译,节约编译时间(没改动的文件不编译)。
2.2. 为什么使用 Makefile
makefile 关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile 就像一个 Shell 脚本一样,其中也可以执行操作系统的命令。
makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。make 是一个命令工具,是一个解释 makefile 中指令的命令工具,一般来说,大多数的 IDE 都有这个命令,比如:Delphi 的 make,Visual C++的 nmake,Linux 下 GNU 的 make。可见,makefile 都成为了一种在工程方面的编译方法。
3. Makefile 入门
3.1. Makefile 语法
我们下面介绍它的常用语法。
目标...: 依赖...
命令1
命令2
...
1.目标:目标即要生成的文件。如果目标文件的更新时间晚于依赖文件的更新时间,则说明依赖文件没有改动,目标文件不需要重新编译。否则重新编译并更新目标。
2.依赖:即目标文件由