• 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 ./