Makefile写法介绍
Makefile写法介绍
最简单的Makefile一行就可以,但你要确信这确实是你想要的
hello:
因为make足够聪明,它会自动把所有hello.c/hello.cpp/hello.o作为输入,这要看你当前目录下到底有什么,是目标文件还是源文件,make会自动调用gcc -c 或 ld,并编译产生输出hello。并调用正确的编译器/连接器,这叫做隐含规则.
也可以这样使用隐含规则,还是因为Make足够聪明
hello:hello.cpp
如果写多一点,但不通用,像这样
hello:hello.c
<TAB>$(CC) hello.c -o hello #<TAB>键必须
CC是make内建变量默认值是gcc,不需要显式赋值。这样的make当hello.c新于hello,那么就会执行编译规则。
如果写完整一点,稍微有点功能,支持大一点的项目 像这样
CC=gcc
LD=ld
CFLAGS=-g -Wall #你想编译调试版(有调试符号),显示所有警告
LDFLAGS=-lc -lm lstdc++ #你链接c函数库,数学函数库, C++,iostream库(比模板快,据我了解,若要编译c++程序,都必须连接这个库。若不想用它,恐怕你必须修改gcc的spec文件,那可是天书)
srcfiles:= $(wildcard *.c) #生成当前目录c源文件列表,用空格分隔。这里用到了make内建函数,顾名思义,wildcard 就是用通配符规则生成c源文件列表,用空格分割,在当前目录的c文件。
header:=$(wildcard *.h) #生成生成当前目录h头文件列表,用空格分隔
objects:= $(patsubst %.c,%.o,$(srcfiles)) #从源文件列表生成目标文件列表(通过替换扩展名,声称目标文件列表)
$(objects):$(header)
<TAB>$(CC) -c $(srcfiles) # <TAB>键必须 ,仅仅编译目标文件
hello:$(objects)
<TAB>$(CC) -c $(objects) # <TAB>键必须 ,仅仅连接产生输出文件
all:hello $(objects)
<TAB>$(CC) -c $(objects) # <TAB>键必须 ,做所有的事情
clean:
<TAB>rm -rc $(objects) hello