My Blog

Makefile

简要记录 makefile 的编写使用

参考B站-正月点灯笼-Makefile的写法

更多了解跟我一起写Makefile


makefile 主要用来简化编译运行程序的过程,以避免手动输入太长的命令

makefile 的格式

target: dependencies
    [tab] command
(回车空一行)

# -----注释-----

# target 指要生成的目标程序,即编译过程的输出,如 C 语言的 a.out
# dependencies 指要所要生成目标程序的依赖,即编译过程的输入,如 test.c
# command 指编译所用到的命令,即编译过程,如 gcc test.c -o test
# [tab] 表明 command 前要用一个 tab 键,命令写完后要用回车空一行

下面以一个 gcc 编译 C 语言为例

test: test.c
    gcc test.c -o test

要使用 makefile,只需在终端输入 makemake -f makefile_name 执行编译,就相当于一个编译过程的脚本

多文件编译

当一个目标程序可能需要用到多个文件,那么该如何编写呢?思路是先将所需的文件先编译,然后再将编译的结果与主程序译一起编译为最终的目标程序

多文件思路

通过上图,就知道了编写 makefile 的顺序,一般 makefile 的写法是从后往前写,即由果索因

main: main.c foo.o bar.o tool.o
    gcc main.c foo.o bar.o tool.o -o main

foo.o: foo.c
    gcc -c foo.c

bar.o: bar.c
    gcc -c bar.c

tool.o: tool.c
    gcc -c tool.c

clean: 
    rm *.o main

上面的 makefile 中的 clean 部分是当程序编译运行成功后,即可将程序打包发走,那么这些编译后的可执行文件就不需要了,即在终端可通过 make clean 命令将这些结果程序删除掉

全局变量

跟 C 语言一样,为了让 makefile 更具灵活性,允许将一些编译命令定义为全局变量,这样在后期改动时,就很省力。

CC = gcc  # 定义编译器
CFLAGS = -lm -Wall -g  # 定义 option

test: test.c
    $(CC) $(CFLAGS) -o test.c

生成多个执行程序

下面将描述多个源文件编译为多个目标文件的过程

生成多个执行程序

CC = gcc
CFLAGS = -lm -Wall -g

all: max min

max: max.c foo.o bar.o
    $(CC) $(CFLAGS) max.c foo.o bar.o -o max

min: min.c foo.o bar.o
    $(CC) $(CFLAGS) min.c foo.o bar.o -o min

foo.o: foo.c
    $(CC) $(CFLAGS) -c foo.c

bar.o: bar.c
    $(CC) $(CFLAGS) -c bar.c

clean: 
    rm *.o max min

all 让 makefile 能够编译 max 和 min,若不用 all,则 makefile 仅会执行 max 这一条编译过程,而 min 的编译会被跳过