学习编写Makefile——最简单的Makefile

EXE = main
OBJ = hello.o hello1.o
SRC = hello.c hello1.c
SRC += hello2.c
CC = gcc
CFLAGS = -g
LDFLAGS = -L . -lFOO

EXE:$(OBJ)
	$(CC) $(LDFLAGS) -o $(EXE) $^
	
OBJ:$(SRC)
	$(CC) $(CFLAGS) -o $(OBJ) -c $^
	
.PHONY:clean
clean:
	-$(RM) $(OBJ) $(EXE)

其中CC CFLAGS LDFLAGS RM等称为预定义变量,其中有些有默认值有的没有默认值。

EXE OBJ SRC都称为变量,变量可以通过=赋值(EXE = main)或者通过+=追加(SRC += hello2.c)

用到变量的地方使用$(变量)引用。变量的功能相当于替换


常见预定义变量如下:

AR                    库文件维护程序的名称,默认值为 ar
AS                    汇编程序的名称,默认值为 as
CC                    C 编译器的名称,默认值为 cc
CPP                  C 预编译器的名称,默认值为$(CC) –E
CXX                  C++编译器的名称,默认值为 g++
FC                     FORTRAN 编译器的名称,默认值为 f77
RM                   文件删除程序的名称,默认值为 rm –f
ARFLAGS         库文件维护程序的选项,无默认值
ASFLAGS          汇编程序的选项,无默认值
CFLAGS            C 编译器的选项,无默认值
CPPFLAGS        C 预编译的选项,无默认值
CXXFLAGS        C++编译器的选项,无默认值

FFLAGS             FORTRAN 编译器的选项,无默认值


$^这类变量称为自动变量,自动变量不用定义,且随着系统环境变量而改变。自动变量同时也会覆盖掉环境变量

$*                     不包含扩展名的目标文件名称
$+                    所有的依赖文件,以空格分开,并以出现的先后为序,可能包含 重复的依赖文件
$<                    第一个依赖文件的名称
$?                     所有时间戳比目标文件晚的依赖文件,并以空格分开
$@                   目标文件的完整名称
$^                    所有不重复的依赖文件,以空格分开

$%                    如果目标是归档成员,则该变量表示目标的归档成员名称


.PHONY称为伪目标,.PHONY:clean,当出现有文件为clean时,make不能运行,所以引入伪目标。

这个目标为一个标签,只执行命令,不出创建目标。

猜你喜欢

转载自blog.csdn.net/mwj327720862/article/details/80158727
今日推荐