我阅读了很多有关CFLAGS
的教程,也查看了官方文档。他们到处说CFLAGS
是隐式的,但仍在其示例makefile中将其显式传递给编译器:
CFLAGS=-O2
gcc $(CFLAGS) -c foo.c -o foo.o
因此,在此上下文中,“隐式”一词是什么意思?如果我在makefile中声明CFLAGS=-O2
,然后再说gcc -c foo.c -o foo.o
,则-O2
是否处于活动状态(因此,它确实是隐式的)吗?如果是这样,为什么所有教程(包括官方文档)仍在其示例中明确传递了它?
他们到处都说CFLAGS是隐式的,但仍将其在示例makefile中显式传递给编译器。
gcc不使用CFLAGS
环境变量。参见Environment Variables Affecting GCC。
CFLAGS
是带有C编译器标志的Makefile变量的常规名称,它由隐式的make规则使用。有关更多详细信息,请参见Variables Used by Implicit Rules。
如果使用自己的制造规则而不是内置的制造规则,则完全不需要使用CFLAGS
。尽管这样做是有用的约定,因为人们熟悉常规的make变量名。
[我相信CFLAGS是通过默认编译规则通过makefile隐式传递给编译器命令行的。但是CFLAGS可以用自定义标志覆盖,以便每个编译命令都可以使用它并使用它。
这意味着可以使用使用CFLAGS的隐式生成规则。因此,您可以使用以下代码编写一行文件:
CFLAGS=-O2
如果您以后再做:
make filename
((省略扩展名)它将使用引用CFLAGS的隐式规则将您的源文件.c转换为可执行文件,因此您无需为简单的构建编写显式的构建语句。
例如如果您准备了源名称file.c,它将使用隐式规则构建它,例如:
$GCC $CFLAGS file.c -o file $LDFLAGS
您可以轻松测试:
$ cat cflags.mak
CFLAGS = -wrong
foo.o: foo.c
$ make -f cflags.mak
cc -wrong -c -o foo.o foo.c
cc: unrecognized option '-wrong'
因此,即使未在规则中明确指定,它也可以使用CFLAGS的值;因此它是隐式的。
但是如果您确实指定了自己的编译.c文件的规则,则如果要使用它,则必须包括它:
$ cat cflags.mak
CFLAGS = -wrong
foo.o: foo.c
gcc -c $<
$ make -f cflags.mak
gcc -c foo.c
这里我为不包含CFLAGS的.c文件提供了自己的规则,因此未使用CFLAGS。
因此,最重要的是,如果您依赖内置的make规则来编译.c文件,则CFLAGS将被隐式包括在内。但是,如果您覆盖该规则,那么如果您仍然希望使用它,则必须明确地包括它。