makefile 隐含变量

本文深入解析Makefile中的隐含变量概念及其使用方法。包括如何通过Makefile、命令行参数或环境变量来重定义这些预定义变量,以及这些操作对编译过程的影响。还列举了一系列常用的隐含变量,涉及编译器、链接器及其他工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

隐含变量
内嵌隐含规则的命令中, 所使用的变量都是预定义的变量。我们将这些变量称为“隐含变量”。这些变量允许对它进行修改:在Makefile中、通过命令行参数或者设置系统环境变量的方式来对它进行重定义。

无论是用那种方式,只要make在运行时它的定义有效,make的隐含规则都会使用这些变量。当然,也可以使用“-R”或“--no builtin-variables”选项来取消所有的隐含变量(同时将取消了所有的隐含规则)。

例如,编译.c源文件的隐含规则为:
“$(CC) -c $(CFLAGS) $(CPPFLAGS)”。


默认的编译命令是“cc”,执行的命令是: “cc –c”。我们可以同上述的任何一种方式将变量 “CC”定义为“ncc”,那么编译.c源文件所执行的命令将是“ncc -c”。

同样我们可以对变量“CFLAGS”进行重定义。对这些变量重定义后如果需要整个工程的各个子目录有效,同样需要使用关键字“export”将他们导出;否则目录间编译命令可能出现不一致。

编译.c源文件时,隐含规则使用“$(CC)”来引用编译器;
“$(CFLAGS)”引用编译选项。

隐含规则中所使用的变量(隐含变量)分为两类:

1. 代表一个程序的名字(例如:“CC”代表了编译器这个可执行程序)。

2. 代表执行这个程序使用的参数(例如:变量“CFLAGS”,多个参数使用空格分开。当然也允许在程序的名字中包含参数。但是这种方式建议不要使用。)


以下是一些作为程序名的隐含变量定义:

代表命令的变量
AR
函数库打包程序,可创建静态库.a文档。默认是“ar”。

AS
汇编程序。默认是“as”。


CC
C编译程序。默认是“cc”。

CXX
C++编译程序。默认是“g++”。

CO
从 RCS中提取文件的程序。默认是“co”。

CPP
C程序的预处理器(输出是标准输出设备)。默认是“$(CC) -E”。

FC
编译器和预处理Fortran 和 Ratfor 源文件的编译器。默认是“f77”。

GET
从SCCS中提取文件程序。默认是“get”

LEX
将 Lex 语言转变为 C 或 Ratfo 的程序。默认是“lex”。

PC
Pascal语言编译器。默认是“pc”。

YACC
Yacc文法分析器(针对于C程序)。默认命令是“yacc”。

YACCR
Yacc文法分析器(针对于Ratfor程序)。默认是“yacc -r”。

MAKEINFO
转换Texinfo源文件(.texi)到Info文件程序。默认是“makeinfo”。

TEX
从TeX源文件创建TeX DVI文件的程序。默认是“tex”。

TEXI2DVI
从Texinfo源文件创建TeX DVI 文件的程序。默认是“texi2dvi”。

WEAVE
转换Web到TeX的程序。默认是“weave”。

CWEAVE
转换C Web 到 TeX的程序。默认是“cweave”。

TANGLE
转换Web到Pascal语言的程序。默认是“tangle”。

CTANGLE
转换C Web 到 C。默认是“ctangle”。

RM
删除命令。默认是“rm -f”。


命令参数的变量
下边的是代表命令执行参数的变量。如果没有给出默认值则默认值为空。

ARFLAGS
执行“AR”命令的命令行参数。默认值是“rv”。

ASFLAGS
执行汇编语器“AS”的命令行参数(明确指定“.s”或“.S”文件时)。

CFLAGS

执行“CC”编译器的命令行参数(编译.c源文件的选项)。

COFLAGS

执行“co”的命令行参数(在RCS中提取文件的选项)。

CPPFLAGS

执行C预处理器“cc -E”的命令行参数(C 和 Fortran 编译器会用到)。

FFLAGS
Fortran语言编译器“f77”执行的命令行参数(编译Fortran源文件的选项)。

GFLAGS

SCCS “get”程序参数。

LDFLAGS

链接器(如:“ld”)参数。

LFLAGS

Lex文法分析器参数。

PFLAGS

Pascal语言编译器参数。

RFLAGS

Ratfor 程序的Fortran 编译器参数。

YFLAGS

Yacc文法分析器参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值