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

标签 c makefile cflags

在我的 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)-isystem directory option GCC 很少有用。

首先阅读关于 Invoking GCC 的文档,假设您使用的是 GCC编译器。顺便说一句,您可以在 Makefile 中包含 CC= gcc。如果您的编译器不是 GCC,而是其他编译器(例如 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 链接,它将调用 ld)。这就是为什么您通常使用 gcc(如食谱中的 $(CC))与 LDFLAGSCFLAGS 进行链接>.

您可以使用 make --trace 甚至 remake (如 remake -x)调试你的 Makefile .

关于c - 哪些规则应该在 GNU make 中使用 CFLAGS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48456276/

相关文章:

c++ - 渐进下溢程序的表示

为 ARM 处理器编译基本 C 文件

c - 跳过不兼容的错误

android - 对于 Android Studio NDK Gradle,如何为不同的文件设置不同的 cFlags?

android - 如何根据gradle flavor 设置变量

c - gprof 输出显示不存在的调用图边缘

c - 分配给结构成员的值不正确

c++ - 在哪些情况下我应该在 Makefile 中保留多个目标而不是一个目标?

makefile - 如何构建 Slick-carousel

makefile - gnu make、microsoft nmake 和 posix standard make 有何相似/不同?