makefile内置符号

特殊符号

Makefile中的四个有用的特殊符号意义和使用,分别是@、$@、$^、$<

@

这个符串通常用在“规则”行中,表示不显示命令本身,而只显示它的结果,例如Makefile中的内容为:

DIR_OBJ=./obj 
CMD_MKOBJDIR=if [ -d ${DIR_OBJ} ]; then exit 0; else mkdir ${DIR_OBJ}; fi 

mkobjdir: 
	@${CMD_MKOBJDIR}

此时不会显示在命令行不会显示出if [ -d ${DIR_OBJ} ]; then exit 0; else mkdir ${DIR_OBJ}; fi,但如果规则行的TAB后没有以@开头,则会显示。

$@ $^ $<

这三个分别表示:

  • $@ 代表目标文件(target)
  • $^ 代表所有的依赖文件(components)
  • $< -代表第一个依赖文件(components中最左边的那个)。

使用上面三个变量,那么简化的Makefile文件为:

main.out:main.o line1.o line2.o 
	g++ -o $@ $^ 

main.o:main.c line1.h line2.h 
	g++ -c $< 

line1.o:line1.c line1.h 
	g++ -c $< 

line2.o:line2.c line2.h 
	g++ -c $<

makefile中预定义变量

预定义变量:

  • $* 不包含扩展名的目标文件名称。
  • $+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
  • $< 第一个依赖文件的名称。
  • $? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
  • $@ 目标的完整名称。
  • $^ 所有的依赖文件,以空格分开,不包含重复的依赖文件。
  • $% 如果目标是归档成员,则该变量表示目标的归档成员名称。 例如,如果目标名称 为 mytarget.so(image.o),则 @为mytarget.so,而% 为 image.o。
  • AR 归档维护程序的名称,默认值为 ar。
  • ARFLAGS 归档维护程序的选项。
  • AS 汇编程序的名称,默认值为 as。
  • ASFLAGS 汇编程序的选项。
  • CC C 编译器的名称,默认值为 cc。
  • CCFLAGS C 编译器的选项。
  • CPP C 预编译器的名称,默认值为 $(CC) -E。
  • CPPFLAGS C 预编译的选项。
  • CXX C++ 编译器的名称,默认值为 g++。
  • CXXFLAGS C++ 编译器的选项。
  • FC FORTRAN 编译器的名称,默认值为 f77。
  • FFLAGS FORTRAN 编译器的选项。

常见赋值操作的含义

常见赋值操作:

  • = 是最基本的赋值
  • := 是覆盖之前的值
  • ?= 是如果没有被赋值过就赋予等号后面的值
  • += 是添加等号后面的值