《Linux环境下C语言编程》V2 Chap13 使用Make
0. 杂问杂记
command必须以TAB开始!
依赖的东东既是目标也是文件?是否会有某种问题?
一篇GNU Make的完整手册:http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/index.html
1. Makefile主要内容
* 显式规则
* 隐式规则
* 变量
* 文件指示
include
条件
多行命令
* 注释
2. 依赖
依赖的东西,似乎既可以是“文件”,也可以是另一个“目标”,如下例:
[root@frank linuxc]# cat Makefile
all : HelloWorld
HelloWorld : Hello.c HiThere.c dummy.c
g++ Hello.c HiThere.c -o HelloWorld
注:dummy.c是一个文件,当它被改变,HelloWorld会被重建,虽然它并不影响HelloWorld的内容。
3. Makefile书写规则
* VPATH Q:What's this ? 2011/12/20
VPATH = src:../headers
* vpath关键字of make
例:
vpath %.h ../headers -> 在../headers目录中的所有*.h文件
Q:具体如何使用?
* 伪目标
.PHONY clean
all:prog1 prog2 prog3
^ 依赖为“目标”而非文件,而通常情况下,目标与目标产生的文件常常是同样的名字。
* 多目标:有何用?
Chap 13, 使用Make
1. 隐含规则:链接object文件
例:
x: x.o y.o
自动推导:
cc -c x.c -o x.o
cc -c y.c -o y.o
cc x.o y.o -o x
rm -f x.o
rm -f y.o
2. 隐含变量
* 命令
AR
函数库打包程序,可创建静态库.a文档。默认是“ar”。
AS
汇编程序。默认是“as”。
CC
C编译程序。默认是“cc”。
CXX
C++编译程序。默认是“g++”。
CO
从 RCS中提取文件的程序。默认是“co”。 Q:What's this ? 2011/12/20
CPP
C程序的预处理器(输出是标准输出设备)。默认是“$(CC) -E”。
RM
删除命令。默认是“rm -f”。
* 参数
ARFLAGS
执行“AR”命令的命令行参数。默认值是“rv”。
ASFLAGS
执行汇编语器“AS”的命令行参数(明确指定“.s”或“.S”文件时)。
CFLAGS
执行“CC”编译器的命令行参数(编译.c源文件的选项)。
CXXFLAGS
执行“g++”编译器的命令行参数(编译.cc源文件的选项)。
COFLAGS
执行“co”的命令行参数(在RCS中提取文件的选项)。
CPPFLAGS
执行C预处理器“cc -E”的命令行参数(C 和 Fortran 编译器会用到)。
3. 隐含规则链