【问题标题】:Do I need to pass CFLAGS explicitly to gcc?我需要将 CFLAGS 显式传递给 gcc 吗?
【发布时间】:2015-07-06 03:26:03
【问题描述】:

我阅读了很多关于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 变量是一个 GNU make 的东西 - 默认情况下,在你的 makefile 中声明的 CFLAGS 将被传递给 C 编译器。

标签: gcc makefile implicit cflags


【解决方案1】:

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

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

CFLAGS 是带有 C 编译器标志的 Makefile 变量的常规名称,它被隐式 make 规则使用。详情请见Variables Used by Implicit Rules。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可以轻松测试它:

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

      【讨论】:

        【解决方案4】:

        这意味着有隐含的make规则,使用CFLAGS,你可以使用。 所以你可以写一个单行的makefile:

        CFLAGS=-O2
        

        如果你以后这样做:

        make filename
        

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

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

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

        见:GNU make documentation

        【讨论】:

          猜你喜欢
          • 2018-02-23
          • 2012-09-15
          • 1970-01-01
          • 2020-03-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-24
          • 1970-01-01
          相关资源
          最近更新 更多