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

时间:2015-04-27 15:22:51

标签: gcc makefile implicit cflags

我阅读了很多关于CFLAGS的教程,并查看了官方文档。他们所说的任何地方CFLAGS都是隐式的,但仍然在它们的示例makefile中明确地将它传递给编译器:

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

那么,“隐含”这个词在这个背景下意味着什么呢?如果我在我的makefile中声明CFLAGS=-O2,之后只说gcc -c foo.c -o foo.o,那么-O2是否有效(所以,它是否真的是隐含的)?如果是这样,为什么所有教程(包括官方文档)仍然在他们的示例中明确地传递它?

4 个答案:

答案 0 :(得分:6)

  

他们说CFLAGS是隐式的,但仍然在他们的示例makefile中明确地将它传递给编译器。

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

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

如果您使用自己的make规则而不是内置规则,则根本不需要使用CFLAGS。虽然这样做很有用,因为人们熟悉传统的make变量名称。

答案 1 :(得分:1)

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

答案 2 :(得分: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

这里我为.c文件提供了自己的规则,但不包括CFLAGS,因此没有使用CFLAGS。

所以最重要的是,如果您依赖内置的make规则来编译.c文件,CFLAGS将被隐式包含在内。但是,如果您覆盖该规则,则必须明确包含它,如果您仍希望使用它。

答案 3 :(得分:0)

这意味着有隐含的make规则,即使用CFLAGS,你可以使用。 所以你可以用:

编写一行makefile
CFLAGS=-02

如果你以后再做:

make filename

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

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

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

请参阅:GNU make documentation