我是否需要将CFLAGS明确传递给gcc?

问题描述 投票:3回答:4

我阅读了很多有关CFLAGS的教程,也查看了官方文档。他们到处说CFLAGS是隐式的,但仍在其示例makefile中将其显式传递给编译器:

CFLAGS=-O2
gcc $(CFLAGS) -c foo.c -o foo.o

因此,在此上下文中,“隐式”一词是什么意思?如果我在makefile中声明CFLAGS=-O2,然后再说gcc -c foo.c -o foo.o,则-O2是否处于活动状态(因此,它确实是隐式的)吗?如果是这样,为什么所有教程(包括官方文档)仍在其示例中明确传递了它?

gcc makefile implicit cflags
4个回答
7
投票

他们到处都说CFLAGS是隐式的,但仍将其在示例makefile中显式传递给编译器。

gcc不使用CFLAGS环境变量。参见Environment Variables Affecting GCC

CFLAGS是带有C编译器标志的Makefile变量的常规名称,它由隐式的make规则使用。有关更多详细信息,请参见Variables Used by Implicit Rules

如果使用自己的制造规则而不是内置的制造规则,则完全不需要使用CFLAGS。尽管这样做是有用的约定,因为人们熟悉常规的make变量名。


1
投票

[我相信CFLAGS是通过默认编译规则通过makefile隐式传递给编译器命令行的。但是CFLAGS可以用自定义标志覆盖,以便每个编译命令都可以使用它并使用它。


1
投票

这意味着可以使用使用CFLAGS的隐式生成规则。因此,您可以使用以下代码编写一行文件:

CFLAGS=-O2

如果您以后再做:

make filename

((省略扩展名)它将使用引用CFLAGS的隐式规则将您的源文件.c转换为可执行文件,因此您无需为简单的构建编写显式的构建语句。

例如如果您准备了源名称file.c,它将使用隐式规则构建它,例如:

$GCC $CFLAGS file.c -o file $LDFLAGS

请参阅:GNU make documentation


0
投票

您可以轻松测试:

$ 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将被隐式包括在内。但是,如果您覆盖该规则,那么如果您仍然希望使用它,则必须明确地包括它。

© www.soinside.com 2019 - 2024. All rights reserved.