1. 从hello world开始,假设在hello.c中有如下代码:
#include <stdio.h>
int main(int argc, char* argv[])
{
printf("hello world.\n");
return 0;
}
把hello.c编译成可执行程序hello,可简单分成下面两步:
gcc -c hello.c #把.c生成.o, -c表示只编译不链接
gcc -o hello hello.o #把.o文件生成可执行程序。-o表示生成可执行程序,后面跟自定义的可执行程序的名字
上述过程在makefile中包含两层依赖关系和两条命令:
hello : hello.o #hello由hello.o生成,所以hello依赖于hello.o,
#依赖关系用分号隔开,左边的叫做目标(target),右边称为依赖(prerequisites)
hello.o : hello.c
当依赖文件被修改时,则执行命令(command),命令跟在依赖关系的下面一行:
hello : hello.o
gcc -o hello hello.o
hello.o : hello.c
gcc -c hello.c #片段1
执行make或make hello命令,就可以得到可行性程序hello了。
综上所述,makefile就是一个简单公式:
target ... : prerequisites ...
command
2.makefile中的隐式规则,.o文件对.c文件的规则会自动执行,所以片段1可以写成:
hello : hello.o
gcc -o hello hello.o #片段2
3. makefile中的3个符号$@,$^,$<。
$@表示目标,$^表示所有的依赖文件,$<表示第一个依赖文件,则片段2可以表示成:
hello : hello.o # 片段3
gcc -o $@ $^ # $@即hello,$^即hello.o,此处只有一个依赖文件,也可以用$<替代$^,
# 即gcc -o $@ $<,多个依赖文件时只能用$^
4.makefile中变量的使用,比如hello.c同时用到了a.c,b.c或多个源文件,则片段3可写成:
objs = hello.o a.o b.o
hello : $(objs) # objs即自定义的变量名,引用时$加小括号扩起来$(objs)
gcc -o $@ $^ # 片段4
5.再定义两个变量,片段4可改写成:
CC = gcc
TARGET = hello
objs = hello.o a.o b.o
$(TARGET) : $(objs)
$(CC) -o $@ $^
6.makefile中换行用Tab键!