我需要将 CFLAGS 显式传递给 gcc 吗?
Do I need to pass CFLAGS explicitly to gcc?
我看了很多关于CFLAGS
的教程,也看了官方文档。他们到处都说 CFLAGS
是隐含的,但仍然在他们的示例 makefile 中将其显式传递给编译器:
CFLAGS=-O2
gcc $(CFLAGS) -c foo.c -o foo.o
那么,术语 "implicit" 在这种情况下是什么意思?如果我在我的 makefile 中声明 CFLAGS=-O2
,然后只声明 gcc -c foo.c -o foo.o
,-O2
是否处于活动状态(所以,它真的是隐式的)吗?如果是这样,为什么所有教程(包括官方文档)仍然在他们的示例中明确传递它?
Everywhere they say CFLAGS is implicit but still pass it explicitly in their example makefile to the compiler.
gcc 不使用 CFLAGS
环境变量。参见 Environment Variables Affecting GCC。
CFLAGS
是带有 C 编译器标志的 Makefile 变量的常规名称,它由隐式 make 规则使用。有关详细信息,请参阅 Variables Used by Implicit Rules。
如果您使用自己的 make 规则而不是内置规则,则根本不需要使用 CFLAGS
。尽管这样做是一种有用的约定,因为人们熟悉约定俗成的 make 变量名称。
我相信 CFLAGS 是通过默认编译规则由 makefile 隐式传递给编译器命令行的...但是 CFLAGS 可以用自定义标志覆盖,以便每个编译命令都可以使用它。
您可以轻松测试它:
$ 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 将被隐式包含。但是,如果您覆盖该规则,如果您仍希望使用它,则必须明确包含它。
表示有隐含的make规则,使用CFLAGS,可以使用。
所以你可以写一个单行的makefile:
CFLAGS=-O2
如果您以后这样做:
make filename
(省略扩展名)它将使用引用 CFLAGS 的隐式规则将源文件 .c 转换为可执行文件,因此您无需为简单构建编写显式构建语句。
例如如果您准备了源名称 file.c ,它将使用隐式规则构建它,例如:
$GCC $CFLAGS file.c -o file $LDFLAGS
我看了很多关于CFLAGS
的教程,也看了官方文档。他们到处都说 CFLAGS
是隐含的,但仍然在他们的示例 makefile 中将其显式传递给编译器:
CFLAGS=-O2
gcc $(CFLAGS) -c foo.c -o foo.o
那么,术语 "implicit" 在这种情况下是什么意思?如果我在我的 makefile 中声明 CFLAGS=-O2
,然后只声明 gcc -c foo.c -o foo.o
,-O2
是否处于活动状态(所以,它真的是隐式的)吗?如果是这样,为什么所有教程(包括官方文档)仍然在他们的示例中明确传递它?
Everywhere they say CFLAGS is implicit but still pass it explicitly in their example makefile to the compiler.
gcc 不使用 CFLAGS
环境变量。参见 Environment Variables Affecting GCC。
CFLAGS
是带有 C 编译器标志的 Makefile 变量的常规名称,它由隐式 make 规则使用。有关详细信息,请参阅 Variables Used by Implicit Rules。
如果您使用自己的 make 规则而不是内置规则,则根本不需要使用 CFLAGS
。尽管这样做是一种有用的约定,因为人们熟悉约定俗成的 make 变量名称。
我相信 CFLAGS 是通过默认编译规则由 makefile 隐式传递给编译器命令行的...但是 CFLAGS 可以用自定义标志覆盖,以便每个编译命令都可以使用它。
您可以轻松测试它:
$ 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 将被隐式包含。但是,如果您覆盖该规则,如果您仍希望使用它,则必须明确包含它。
表示有隐含的make规则,使用CFLAGS,可以使用。 所以你可以写一个单行的makefile:
CFLAGS=-O2
如果您以后这样做:
make filename
(省略扩展名)它将使用引用 CFLAGS 的隐式规则将源文件 .c 转换为可执行文件,因此您无需为简单构建编写显式构建语句。
例如如果您准备了源名称 file.c ,它将使用隐式规则构建它,例如:
$GCC $CFLAGS file.c -o file $LDFLAGS