1

在我的 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 的目的是什么?

4

1 回答 1

2

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

你是对的CFLAGS(但我会在-g那里补充)。但我不确定你是否需要-isystem $(SQLITEDIR),它可能可以-I $(SQLITEDIR)代替。GCC的-isystem 目录选项很少有用。

首先阅读有关Invoking GCC的文档,假设您使用的是GCC编译器。顺便说一句,你可以CC= gcc在你的Makefile. 如果您的编译器不是 GCC 而是其他东西(例如Clang/LLVM),请阅读其文档。

然后,运行make -p以了解GNU make的内置规则(其中有很多)。您会发现许多内置规则正在使用CFLAGS等。这就是为什么在您的;中有一个CFLAGS变量更简单的原因。Makefile如果可能的话,利用一些已知的内置规则make

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

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

CFLAGS通常包含一些(优化或其他)标志(例如-Oor -g, or ),它们在链接-pthread步骤中也相关(假设您链接到,这将调用)。这就是为什么您通常将 using (如在您的食谱中)与和链接。gccldgcc$(CC)LDFLAGSCFLAGS

您可以使用make --trace甚至重新制作(as remake -x) 来调试您的Makefile.

于 2018-01-26T05:45:00.703 回答