在我的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的目的是什么?
答案 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标准定义了cc
和make
所理解的一些选项(以及make
的一些最小规则)。 GCC和GNU都有更多。阅读documentation of GNU make。
CFLAGS
通常包含一些(优化或其他)标记(例如-O
或-g
或-pthread
),这些标记在linking步骤中也相关(假设您与gcc
链接,这将调用ld
)。这就是为什么您通常使用gcc
(在配方中为$(CC)
)与LDFLAGS
和CFLAGS
进行关联。