典型的makefile规则如下,参考howto_makefiles
- target 通常是程序所生成的文件的名字,类型如可执行文件或目标文件(.o)
- dependency是用来创建目标文件的依赖文件,target会依赖好几个这样的文件
- command 是make所要执行的命令,可能有多个,每个命令都必须以tab键开头
target :dependency1 dependency2 ...
command
#使用目标文件program.o和mylib.o生成可执行文件program
program: program.o mylib.o
gcc -o program program.o mylib.o
单个文件的编译很简单
myprog : myprog.c
gcc -g -Wall -o myprog myprog.c
规则很简单,但上面的只能针对具体的文件,不够通用,我们可以简单泛化,对于单个文件,只要配置TARGET 为源文件名称即可
# 使用参数配置编译器, gcc for C , g++ for C++
CC = gcc
# 编译参数设置:
# -g 在可执行文件中添加调试信息
# -Wall 尽可能多的显示编译警告
CFLAGS = -g -Wall
# 最终可执行的目标文件,
TARGET = myprog
$(TARGET): $(TARGET).c
$(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c
但实际中开发很少是单文件编译,下面看如何使用多个源文件编译,其实本质和盖楼一样,每一步依赖之前的产出,比如创建一个可执行文件 count 我们需要三个目标文件countwords.o, counter.o, 和 scanner.o:
count: countwords.o counter.o scanner.o
$(CC) $(CFLAGS) -o count countwords.o counter.o scanner.o
目标文件countwords.o如果不存在,也是需要从源文件编译生成的 ,假如是 countwords.c, scanner.h, and counter.h:
countwords.o: countwords.c scanner.h counter.h
$(CC) $(CFLAGS) -c countwords.c
同理,counter.o scanner.o也是这个思路
counter.o: counter.c counter.h
$(CC) $(CFLAGS) -c counter.c
scanner.o: scanner.c scanner.h
$(CC) $(CFLAGS) -c scanner.c
合在一起就是多文件编译生成最终可执行文件count,这种写法和我们手动编译是反者的,它是从结果找条件,手动编译的先创造条件最终生成结果。了解规则以后,写起来就很容易
count: countwords.o counter.o scanner.o
$(CC) $(CFLAGS) -o count countwords.o counter.o scanner.o
countwords.o: countwords.c scanner.h counter.h
$(CC) $(CFLAGS) -c countwords.c
counter.o: counter.c counter.h
$(CC) $(CFLAGS) -c counter.c
scanner.o: scanner.c scanner.h
$(CC) $(CFLAGS) -c scanner.c
由于makefile只能有一个目标,当TARGET有多个目标文件时,可以构造一个没有规则的终极目标all,并以冒号后面的文件作为依赖
all:main1 main2
main1: main1.c
gcc main1.c -o main1
main2: main2.c
gcc main2.c -o main2
网友评论