哪些规则应该在 GNU make 中使用 CFLAGS

Which rules should use CFLAGS in GNU make

在我的 C 项目的 makefile 中,我将 CFLAGS 变量设置如下 -

CFLAGS=-ansi -pedantic -Wall -Wextra -O2 -isystem $(SQLITEDIR)

我希望这个变量用于构建目标文件的规则,因为标志会影响编译步骤

但是,在 GNU make 手册中

https://www.gnu.org/software/make/manual/make.html#Using-Implicit

我看到下面的例子-

foo : foo.o bar.o
    cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS)

我认为这是链接步骤的规则,所以我理解它为什么包含 LDFLAGS,但是这里的 CFLAGS 的目的是什么?

(我猜你在某些 Linux 系统上使用 GNU make

您对 CFLAGS 的使用是正确的(但我会在此处添加 -g)。但我不确定您是否需要 -isystem $(SQLITEDIR),它可能可以改为 -I $(SQLITEDIR)。 GCC 的 -isystem directory option 很少有用。

首先阅读有关 Invoking GCC, assuming you are using the GCC compiler. BTW, you could have CC= gcc in your Makefile. If your compiler is not GCC but something else (e.g. Clang/LLVM) 的文档。

然后,运行 make -p 了解你的 GNU make 的内置规则(有很多)。您会发现许多内置规则都使用 CFLAGS 等。这就是为什么在 Makefile 中使用 CFLAGS 变量更简单;如果可能,利用 make.

已知的一些内置规则

顺便说一句,您可以避免使用任何内置规则和变量,但那样品味很差。

POSIX 标准定义了 ccmake 理解的一些选项(以及 make 的一些最小规则)。 GCC 和 GNU make 都有更多。阅读 documentation of GNU make.

CFLAGS 通常包含一些(优化或其他)标志(例如 -O-g,或 -pthread),这些标志也与 linking 步骤(假设您使用 gcc link,这将调用 ld)。这就是为什么您通常 link 使用 gcc(如食谱中的 $(CC))同时使用 LDFLAGSCFLAGS

您可以使用 make --trace 甚至 remake (as remake -x) to debug your Makefile