在我的 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 标准定义了一些cc
和make
可以理解的选项(以及make
的一些最小规则)。 GCC 和 GNU make 都有更多。阅读documentation of GNU make .
CFLAGS
通常包含一些(优化或其他)标志(例如 -O
或 -g
,或 -pthread
) 也与 linking 相关步骤(假设您使用 gcc
链接,它将调用 ld
)。这就是为什么您通常使用 gcc
(如食谱中的 $(CC)
)与 LDFLAGS
和 CFLAGS
进行链接>.
关于c - 哪些规则应该在 GNU make 中使用 CFLAGS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48456276/