在Makefile上放东西(CFLAGS或CXXFLAGS)在哪里

Where to put things (CFLAGS or CXXFLAGS) on Makefile?

本文关键字:CFLAGS CXXFLAGS 在哪里 Makefile      更新时间:2023-10-16

首先这里的Makefile

CFLAGS   = -g -Wall -lm

那时候我在玩C。现在我在C++上,我必须添加-I eigen,快速搜索它,发现CXXFLAGS存在于C++世界,而CFLAGS存在于C世界。所以我将Makefile更新为

CFLAGS   = -g -Wall -lm
CXXFLAGS = -I eigen

然后我发现https://wiki.gentoo.org/wiki/GCC_optimization,并受到启发再次更新

CFLAGS   = -g -Wall -lm
CXXFLAGS = ${CFLAGS} -I eigen

完整的东西:

CC       = g++
CFLAGS   = -g -Wall -lm
CXXFLAGS = ${CFLAGS} -I eigen
OBJS     = main.o multiply.o 
PROGRAM  = multitply
$(PROGRAM): $(OBJS)
$(CC) $(OBJS) $(CFLAGS) -o $(PROGRAM)

我应该将-I eigen添加到CXXFLAGS还是CFLAGS

还注意到CCD_ 13的存在。

我应该换成$(CC) $(OBJS) $(CXXFLAGS) $(CPPFLAGS) -o $(PROGRAM)吗还是$(CC) $(OBJS) -o $(PROGRAM)

我是否应该更改为$(PROGRAM): $(OBJS) *.h,以便在.h文件发生更改时重新构建?

还有其他改进吗?

编译C文件时我会使用CFLAGS,编译C++文件时使用CXXFLAGS。除了CFLAGSCXXFLAGS之外,您可能还缺少另一个相关变量:CPPFLAGS

我应该将-I eigen添加到CXXFLAGS还是CFLAGS

CPPFLAGS通常用于提供与预处理器相关的选项。我会使用这个变量来指定include目录:

CPPFLAGS = -I eigen

另一个对提供库很有用的有趣变量是LDLIBS。你可以利用它通过-lm:

LDLIBS = -lm

我是否应该更改为$(PROGRAM): $(OBJS) *.h,以便在.h文件发生更改时重新构建?

我建议的方法是通过编写没有配方的规则,将头文件的先决条件添加到相应的对象文件中,例如:

main.o: main.h multiply.h ...
multiply.o: multiply.h ...

此外,*不会做您期望做的事情,也就是说,它在该上下文中不是通配符。将这些行放在Makefile的末尾,这样它们就不会替换默认目标。


Makefile可能类似于:

CXXFLAGS = -g -Wall
CPPFLAGS = -I eigen
LDLIBS   = -lm
OBJS     = main.o multiply.o 
PROGRAM  = multitply
$(PROGRAM): $(OBJS)
$(CXX) $^ $(LDLIBS) -o $@

无需在配方中重复$(PROGRAM)$(OBJS),只需分别使用自动变量$@$^即可。