一个Makefile中通常包含以下内容:
需要创建的目标体 target ,通常为目标文件或可执行文件
创建目标所以来的文件 dependency_file
创建目标时运行的命令 command
格式为:
target : dependency_file
command
注意,在command之前必须有一个 tab 符
hello.o : hello.c hello.h
gcc -c hello.c -o hello.o
1.在Makefile中可以使用变量替代常用的字符串,这个字符串可以是目标体,依赖文件,命令或者Makefile中的其他部分
变量定义: VAR=var 递归展开,即如果var中包含其他变量,则也将其展开
VAR:=var 简单展开,即只展开一次,不管var为何内容
变量使用: $(VAR)
2.Makefile中常见的预定义变量
AR 库文件维护程序的名称
AS 汇编程序的名称
CC C编译器的名称,
CPP C预编译器的名称, $(CC) -E
CXX C++编译器的名称
ASFLAGS 相对应的选项
CFLAGS
CPPFLAGS
CXXFLAGS
2.Makefile中常见的自动变量如下,他们都具有本地含义,即只在自己所属的结构体中有效
$* 不包含扩展名的目标文件名称
$@ 目标文件的完整名称
$+ 所有的依赖文件,有可能重复,以空格分割
$^ 所有不重复的依赖文件,以空格分割
$< 第一个依赖的文件
$? 所以时间戳比目标文件晚的依赖文件
3.Makefile规则
Makefile有自己的隐式规则
即所有的 .o 文件都可以由 同名 的 .c 或 .cc 文件生成
$(CC) -c $(CPPFLAGS) file.c -o file.o
Makefile也允许自定义规则,但是相关文件前必须加上 %
4.Make命令的使用
如果不加参数,则make默认读入当前文件夹下的Makefile,并建立其中的第一个目标
make -C dir 读入指定目录dir下的Makefile
make是可以带参数的,我这里写的是子文件夹里的Makefile的变量CC和CFLAG都用我这个主Makefile里的设置。
需要创建的目标体 target ,通常为目标文件或可执行文件
创建目标所以来的文件 dependency_file
创建目标时运行的命令 command
格式为:
target : dependency_file
command
注意,在command之前必须有一个 tab 符
hello.o : hello.c hello.h
gcc -c hello.c -o hello.o
1.在Makefile中可以使用变量替代常用的字符串,这个字符串可以是目标体,依赖文件,命令或者Makefile中的其他部分
变量定义: VAR=var 递归展开,即如果var中包含其他变量,则也将其展开
VAR:=var 简单展开,即只展开一次,不管var为何内容
变量使用: $(VAR)
2.Makefile中常见的预定义变量
AR 库文件维护程序的名称
AS 汇编程序的名称
CC C编译器的名称,
CPP C预编译器的名称, $(CC) -E
CXX C++编译器的名称
ASFLAGS 相对应的选项
CFLAGS
CPPFLAGS
CXXFLAGS
2.Makefile中常见的自动变量如下,他们都具有本地含义,即只在自己所属的结构体中有效
$* 不包含扩展名的目标文件名称
$@ 目标文件的完整名称
$+ 所有的依赖文件,有可能重复,以空格分割
$^ 所有不重复的依赖文件,以空格分割
$< 第一个依赖的文件
$? 所以时间戳比目标文件晚的依赖文件
3.Makefile规则
Makefile有自己的隐式规则
即所有的 .o 文件都可以由 同名 的 .c 或 .cc 文件生成
$(CC) -c $(CPPFLAGS) file.c -o file.o
Makefile也允许自定义规则,但是相关文件前必须加上 %
4.Make命令的使用
如果不加参数,则make默认读入当前文件夹下的Makefile,并建立其中的第一个目标
make -C dir 读入指定目录dir下的Makefile
make -f file 读入当前目录下的file文件作为Makefile
写了一个文件夹比较多的程序,在写主Makefile的时候,需要进入子文件夹执行make,在这里记录下,自己运行成功的Makefile。
- SUBDIRS=directory1 directory2 directory3
- RECURSIVE_MAKE= @for subdir in $(SUBDIRS); \
- do \
- echo "making in $subdir"; \
- ( cd $subdir && $(MAKE) all -f Makefile -e CC='${CC}' CFLAG='${CFLAG}') || exit 1; \
- done
- RECURSIVE_CLEAN= @for subdir in $(SUBDIRS); \
- do \
- echo "cleaning in $subdir"; \
- ( cd $subdir && $(MAKE) clean -f Makefile) || exit 1; \
- done
- subdirs:
- $(RECURSIVE_MAKE)
- all: subdirs
- dclean:
- $(RECURSIVE_CLEAN)
make是可以带参数的,我这里写的是子文件夹里的Makefile的变量CC和CFLAG都用我这个主Makefile里的设置。