Makefile 静态模式

来源:互联网 发布:代理服务器源码 编辑:程序博客网 时间:2024/06/18 06:59

静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和灵活。

  • makefile 中的all是做什么的?
  • Makefile 静态模式——$(objects): %.o: %.c、$<

0. 一种更复杂的规则

<targets ...>: <target-pattern>: <prereq-patterns ...>  <commands>

1. %.o、%.c

  • 如果我们的<target-parrtern>(目标模式)定义成“%.o”,意思是<target>集合中都是以“.o”结尾的,而如果我们的<prereq-parrterns>(依赖模式)定义成“%.c”,意思是对<target-parrtern>所形成的目标集进行二次定义,其计算方法是,取<target-parrtern>模式中的“%”(也就是去掉了[.o]这个结尾),并为其加上[.c]这个结尾,形成的新集合。所以,我们的“目标模式”或是“依赖模式”中都应该有“%”这个字符。
objects = foo.o bar.oall: $(objects)$(objects): %.o: %.c$(CC) -c $(CFLAGS) $< -o $@

2. $@, $<

  • $@:目标;
  • $<:第一个依赖;
  • $^:表示所有的依赖
    • $(word 2, $^):第二个依赖;
    • $(word n,text) 函数用来提取 text 中的第 n 个词

3. all

  • all: 一般代表编译所有相关项目。

比如要把一个 hello.cpp 文件编译成 hello(可执行应用程序):

all: hello anotherhello: hello.cpp    g++ -o $@ $<another: another.cpp    g++ -o $@ $<
  • 直接 make 或 make all 的话会执行 hello.cpp 和 another.cpp 的编译命令
    • 后面不加参数的话,会把第一个目标作为默认的
  • make hello 的话只编译 hello.cpp
  • make another 的话只编译 another.cpp

4. .PHONY

.phony是表示 目标是伪目标,并不生成相应的文件。.phony标志的文件总是执行的。

原创粉丝点击