Makefile 教程

前言

Makefile 是用于自动化编译和构建项目的工具。Makefile 主要用于 C/C++文件的编译场景中。它将构建项目的规则写入一个或多个名为 makefileMakefile 的文件中,然后通过 make 命令就可以调用这些规则来构建项目。

Makefile 是 UNIX/Linux 系统中用于自动化构建项目或编译和安装 开源项目的常用工具。

我们有如下的 C 语言的源代码程序,现在需要将其编译链接成为一个应用程序 myapp

源码文件如下

myapp/
├── file1.c
├── file2.c
└── main.c

我们手动编译上述程序需要将 file1.cfile2.cmain.c 生成目标文件 file1.ofile2.omain.o,然后再将 三个 .o 文件链接成一个应用程序 myapp

如下步骤:

weimingze@mzstudio:~/myapp$ ls
file1.c  file1.h  file2.c  file2.h  main.c
weimingze@mzstudio:~/myapp$ gcc -c file1.c 
weimingze@mzstudio:~/myapp$ gcc -c file2.c 
weimingze@mzstudio:~/myapp$ gcc -c main.c 
weimingze@mzstudio:~/myapp$ gcc -o myapp main.o file1.c file2.c 
weimingze@mzstudio:~/myapp$ ls
file1.c  file1.h  file1.o  file2.c  file2.h  file2.o  main.c  main.o  myapp

注:weimingze@mzstudio:~/myapp$ 是我的终端的命令行提示符。

如果你的环境中没有 gcc 这个命令,请用如下命令安装。

1、在 Ubuntu Linux 下可以使用 sudo apt install gcc 安装。

2、在 CentOS Linux 下可以使用 sudo yum install gcc 安装。

3、在 Mac OS 下可以使用 brew install gcc 安装。

上述文件编译的过程是这样的

+---------+     +---------+
| file1.c | --> | file1.o | -->.
+---------+     +---------+    |
                               |
+---------+     +---------+    |         +-------+
| file2.c | --> | file2.o | ---+-------> | myapp |
+---------+     +---------+    |         +-------+
                               |
+---------+     +---------+    |
|  main.c | --> |  main.o | -->`
+---------+     +---------+

可见手动编译和链接这些文件比较麻烦。如果文件超过几百个,那么编译的工作量将是巨大的。解决这个问题的办法是使用 Makefile。

Makefile 常用于如下场景:

  1. C/C++ 语言编译和链接。
  2. Go 语言管理和构建。
  3. Qt 应用程序的构建。
  4. Linux 内核编译。

本课程将用最简单的方式,逐步深入的学习 Makefile 的用法。