教程 > makefile > 阅读:60

makefile 宏——迹忆客-ag捕鱼王app官网

make 程序允许我们使用类似于变量的宏。 宏在 makefile 中定义为 = 对。 下面显示了一个示例

macros  = -me
psroff  = groff -tps
ditroff = groff -tdvi
cflags  = -o -systype bsd43
libs    = "-lncurses -lm -lsdl"
myface  = ":*)"

特殊宏

在目标规则集中发出任何命令之前,有一些预定义的特殊宏

  • $@ 是要创建的文件的名称。
  • $? 是更改后的依赖的名称。

例如,我们可以使用如下规则

hello: main.cpp hello.cpp factorial.cpp
   $(cc) $(cflags) $? $(ldflags) -o $@
alternatively:
hello: main.cpp hello.cpp factorial.cpp
   $(cc) $(cflags) $@.cpp $(ldflags) -o $@

在这个例子中,$@ 代表你好,$?$@.cpp 获取所有更改的源文件。

隐式规则中还使用了两个特殊的宏。 他们是

  • $< 导致操作的相关文件的名称。
  • $* 目标和依赖文件共享的前缀。

常见的隐含规则是从 .cpp(源文件)构建 .o(对象)文件。

.cpp.o:
   $(cc) $(cflags) -c $<
alternatively:
.cpp.o:
   $(cc) $(cflags) -c $*.c

常规宏

有各种默认宏。 我们可以通过键入“make -p”打印出默认值来查看它们。 从使用它们的规则来看,大多数都非常明显。

这些预定义变量,即隐式规则中使用的宏,分为两类。 它们如下

  • 作为程序名称的宏(例如 cc)
  • 包含程序参数的宏(例如 cflags)。

下表列出了在 makefile 的内置规则中用作程序名称的一些常用变量

序号 变量 描述
1 ar 档案维护程序; 默认为“ar”。
2 as 编译汇编文件的程序; 默认为“as”。
3 cc 编写c程序的程序; 默认为“cc”。
4 co 从 rcs 检出文件的程序; 默认为“co”。
5 cxx 编译c 程序的程序; 默认为“g ”。
6 cpp 运行 c 预处理器的程序,将结果输出到标准输出; 默认是“$(cc) -e”。
7 fc 编译或预处理 fortran 和 ratfor 程序的程序; 默认为“f77”。
8 get 从 sccs 中提取文件的程序; 默认为“get”。
9 lex 用于将 lex 语法转换为源代码的程序; 默认为“lex”。
10 yacc 用于将 yacc 语法转换为源代码的程序; 默认为“yacc”。
11 lint 用于在源代码上运行 lint 的程序; 默认是“lint”。
12 m2c 用于编译 modula-2 源代码的程序; 默认为“m2c”。
13 pc 编译 pascal 程序的程序; 默认为“pc”。
14 makeinfo 将 texinfo 源文件转换为 info 文件的程序; 默认是“makeinfo”。
15 tex 从 tex 源文件制作 tex dvi 文件的程序; 默认为“tex”。
16 texi2dvi 从 texinfo 源文件制作 tex dvi 文件的程序; 默认为“texi2dvi”。
17 weave 将 web 翻译成 tex 的程序; 默认为“weave”。
18 cweave 将 c web 翻译成 tex 的程序; 默认为“cweave”。
19 tangle 将 web 翻译成 pascal 的程序; 默认是“tangle”。
20 ctangle 将 c web 翻译成 c 的程序; 默认为“ctangle”。
21 rm 删除文件的命令; 默认为“rm -f”。

这是一个变量表,其值是上述程序的附加参数。 除非另有说明,否则所有这些的默认值都是空字符串。

序号 变量 描述
1 arflags 给档案维护程序的标志; 默认为“rv”。
2 asflags 在“.s”或“.s”文件上显式调用时给予汇编程序的额外标志。
3 cflags 提供给 c 编译器的额外标志。
4 cxxflags 提供给 c 编译器的额外标志。
5 coflags 提供给 rcs 合作程序的额外标志。
6 cppflags 给予 c 预处理器和使用它的程序(例如 c 和 fortran 编译器)的额外标志。
7 fflags 提供给 fortran 编译器的额外标志。
8 gflags 提供给 sccs get 程序的额外标志。
9 ldflags 当编译器应该调用链接器 `ld' 时提供给编译器的额外标志。
10 lflags 给 lex 的额外标志。
11 yflags 给 yacc 的额外标志。
12 pflags 提供给 pascal 编译器的额外标志。
13 rflags 为 ratfor 程序提供给 fortran 编译器的额外标志。
14 lintflags 给 lint 的额外标志。

注意 我们可以使用“-r”或“--no-builtin-variables”选项取消隐式规则使用的所有变量。

我们还可以在命令行定义宏,如下所示

make cpp = /home/courses/cop4530/spring02

查看笔记

扫码一下
查看教程更方便
网站地图