标签:makefile
makefile
预定义变量
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语言 编译器的编译选项 |
例:$(OBJS):%o:%c
gcc -c %< -o %@
这个的作用是把OBJS内的.o拓展名替换为.c拓展名。如果OBJS的目标中作为依赖域,那么每个目标,对应的COMMAND都会执行一次
CFLAGS = -Ilib 表示到lib目录下寻找头文件
自动变量
$* |
表示目标文件的名称,不包括拓展名 |
$+ |
表示所有的依赖文件,这些文件之间以空格隔开,按出现的顺序,可能包含重复文件 |
$< |
表示依赖项中的第一个依赖文件的名称 |
$? |
依赖相中,所有目标文件时间戳晚的依赖文件,依赖文件之间用空格分开 |
$@ |
目标项中目标文件的名称 |
$^ |
依赖项中,所有不重复的文件,以空格隔开 |
VPATH
目录搜索,使用方法:VPATH=path1:path2:...
CFLAGS = -Iadd -Isub -O2
OBJSDIR = .objs
VPATH=add:sub:.
OBJS = add_init.o add_float.o sub_init.o sub_float.o main.o
TARGET = cacu
$(TARGET):$(OBJDIR) $(OBJS)
$(CC) -o $(TARGET) $(OBJSDIR) /*.o $(CFLAGS)
$(OBJS):%.o:%.c:
$(CC) -c $(CFLAGS) $< -o $(OBJDIR)/%@ #自动替换和目录搜索组合功能貌似失效了
$(OBJDIR):
mkdir -p ./$@
clean:
-$(RM) $(TARGET)
-$(RM) $(OBJSDIR)/*.o
自动推导规则
隐含的规则,对.o文件,默认用gcc -c .c产生
递归make
cd add && $(MAKE)
使用
add:
或:
add:
$(MAKE) -C add
执行子目录make
使用 export命令向下层Makefile传递变量
使用${shell command}执行命令
函数
FILES = $(foreach dir,$(DIRS),$(wildcard $(dis)/*.c))
获取匹配模式的文件名wildcard $(wildcard PATTERN)查找当前目录下符合模式PATTERN的文件名,其返回值用空格分割 模式替换函数patsubst 原型:$(patsubst) pattern,replacement,text) 例:$(patsubst %.c,%.o,$(wildcard *.c)),把当前目录所有的.c替换问.o 循环函数foreach 原型:$(foreach VAR,LIST,TEXT),foreach将LIST中每一个用空格分隔的单词,先传给临时变量VAR,然后执行TEXT表达式,其返回值是空格分割表达式TEXT的计算结果。 例:DIRS = sub add ./本文出自 “重剑无锋” 博客,请务必保留此出处http://qianyang.blog.51cto.com/7130735/1615115
标签:makefile
原文地址:http://qianyang.blog.51cto.com/7130735/1615115