规则
- 编译一个 C 程序:
通过执行下面命令从 n.c 自动生成 n.o。
$(CC) -c $(CPPFLAGS) $(CFLAGS) $^ -o $@
- 编译一个 C++ 程序:
通过执行下面命令从 n.cc(或 n.cpp)自动生成 n.o。
$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $^ -o $@
- 链接单个对象文件:
通过执行下面命令,从 n.o 自动生成 n。
$(CC) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) -o $@
关于上述三条规则中的一些变量解释:
CC:C 程序编译程序,默认是 cc。
CXX: C++ 程序编译程序,默认是 g++。
CFLAGS:传递给 C 编译器的可选参数。
CXXFLAGS:传递给 C++ 编译器的可选参数。
CPPFLAGS:传递给 C 预处理器的可选参数。
LDFLAGS:传递给编译器的可选参数,在编译器调用链接器时使用。
一个简单的例子
参看下面 Makefile:
CC = gcc # Flag for implicit rules
CFLAGS = -g # Flag for implicit rules. Turn on debug info
# 通过 C 链接器隐式规则构建 blah
# 通过 C 编译器隐式规则构造 blah.o
blah: blah.o
blah.c:
echo "int main() { return 0; }" > blah.c
clean:
rm -f blah*
执行 make 之后,编译成功,同时目录下生成 blah、blah.o 和 blah.c 三个文件。
总结
- 隐式规则会使用预定义变量完成编译工作;
- 这些预定义变量是可修改的,例如上面例子,通过改变预定义变量来改变隐式规则的部分行为。
- 只有当自定义规则不存在时,才会使用隐式规则。