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

时间:2018-01-26 05:38:08

标签: 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的目的是什么?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

顺便说一句,你可以避免使用任何内置的规则和变量,但这是不好的味道。

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

CFLAGS通常包含一些(优化或其他)标记(例如-O-g-pthread),这些标记在linking步骤中也相关(假设您与gcc链接,这将调用ld)。这就是为什么您通常使用gcc(在配方中为$(CC))与LDFLAGSCFLAGS进行关联。

您可以使用make --trace甚至remakeremake -x}来调试Makefile