— 由make工具创建的目标提(target),通常是目标文件或可执行文件。
— 要创建的目标所依赖的文件(dependency_file)。
— 创建每个目标体时需要运行的命令(command)。
— 注意:命令行前面必须是一个“TAB”键,否则编译错误为:*** missing separator. Stop。
target :dependency_files
hello.o : hello.c hello.h
gcc -c hello.c -o hello.o
sunq:kang.o yul.o
gcc kang.o yul.o -o sunq
kang.o:kang.c kang.h
gcc -Wall -O -g -c kang.c -o kang.o
yul.o : yul.c
gcc -Wall -O -g -c yul.c -o yul.o
注释:-Wall :表示允许发出gcc所有有用的报警信息。
-c :只是编译不链接,生成目标文件 “.o”
-o file:表示把输出文件输出到file里
关于更多的使用man工具了解。
1、系列文件的名字。
2、传递给编译器的参数。
3、需要运行的程序。
4、需要查找源代码的目录。
5、需要输出信息的目录。
6、你想要做的其他事情。
它可以向后引用变量
不能对该变量进行任何扩展,例如
CFLAGS = $(CFLAGS) -0 会造成死循环。
m :=mm
x:=$(m)
my:=$(x)bar
x:=later
echo $(x)$(y) --------- 看看打印什么信息。
例子
foo = $(bar)
bar= $(ugh)
ugh= $(bar)
foo = Huh?
$(foo)的值为?
echo $(foo)来进行查看
— — 用这种方式定义的变量,会在变量的定义点,按照被引用的变量的当前值进行展开
— — 这种定义变量的方式更适合再大的编程项目中使用,因为它更像我们一般的编程语言。l
例子:
OBJS = kang.o yul.o
CC = gcc
CFLAGS= -Wall -O -g
sunq : $(OBJS)
$(CC) $(OBJS) -O sunq
kang.o :kang.c kang.h
$(CC)$(CFLAGS) -c kang.c -o kang.o
yul.o : yul.c yul.h
$(CC)$(CFLAGS) -c yul.c -o yul.o
dir := /foo/bar
FOO ?= bar
FOO 是?
— — 含义是 ,如果FOO没有被定义过,那么变量FOO的值就是”bar“,如果FOO先前被定义过,那么这条语句将什么也不做,其等价于:
ifeq($(origin FOO),undefined)
FOO = bar
endif
你可以通过+=为已定义的变量添加新的值
例如:Main = hello.o hello-1.o
Main+=hello-2.o
— AR 库文件维护程序的名称,默认值为ar。AS汇编程序的名称,默认值为as。
— CC C编译器的名称,默认值为cc。CPP C编译器的名臣,默认值为$(CC) -E
— CXX C++编译器的名臣,默认值为g++。
— FC FORTRAN编译器的名称,默认值为f77。
— RM 文件删除程序的名称,默认值为rm -f。
例子:
Hello :main .c main.h
clean:
— ARFLAGS 库文件维护程序的选项,无默认值
— ASFLAGS 汇编程序的选项,无默认值。
— CFLAGS C编译器的选项,无默认值
— CPPFLAGS C编译器的选项,无默认值
— CXXFLAGS C++编译器的选项,无默认值
— FFLAGS FORTRAN编译器的选项,无默认值
例如:
OBJS = kang.o yul.o
CC = gcc
CFLAGS= -Wall -O -g
sunq : $(OBJS)
$(CC) $(OBJS) -o sunq
kang.o :kang.c kang.h
$(CC)$(CFLAGS) -c kang.c -o kang.o
yul.o : yul.c yul.h
$(CC)$(CFLAGS) -c yul.c -o yul.o
— $* 不包含扩展名的目标文件名称
— $+ 所有的依赖文件,以空格分开,并以出现的先后为序,可以包含重复的依赖文件。
— $< 第一个依赖文件的名称。
— $? 所有时间戳比目标文件晚的依赖文件,并以空格分开
— $@ 目标文件的完整名称
— $^ 所有不重复的目标依赖文件,以空格分开。
— $% 如果目标是归档成员,则该变量表示目标的归档成员名称。
例子:
OBJS = kang.o yul.o
CC = gcc
CFLAGS= -Wall -O -g
sunq : $(OBJS)
$(CC) $^ -o $@
kang.o :kang.c kang.h
$(CC)$(CFLAGS) -c $< -o $@
yul.o : yul.c yul.h
$(CC)$(CFLAGS) -c $< -o $@
OBJS=f1.o f2.o
OBJS+=main.o
CFLAGS=-c -Wall
test.o:$(OBJS)
gcc $(OBJS) -o test
f2.o:$<
gcc -c -Wall f2.c -o $@
f1.o:f1.c
gcc $(CFLAGS) f1.c -o $@
main.o:main.c
gcc -c -Wall main.c -o main.o
.PHONY:clean
clean:
rm *.o test
— make在启动时会自动读取系统当前已经定义了的环境变量,并且会创建与之具有相同名称和数值的变量。
— 如果用户在Makefile中定义 了相同名称的变量,那么用户自定的变量将会覆盖同名的环境变量。
— -C dir 读入指定目录下的Makefile
— -f file 读入当前目录下的file文件作为Makefile
— -i 忽略所有的命令换行错误
— -I dir 指定被包含的Makefile所在目录
— -n 只打印要执行的命令,但不执行这些命令。
— -p 显示make变量数据库和隐含规则
— -s 在执行命令时不显示命令
— -w 如果make在执行过程中改变目录,打印当前目录名。