把东西(CFLAGS 或 CXXFLAGS)放在 Makefile 的什么地方?

KcF*_*nMi 5 c c++ makefile gnu-make c++11

首先Makefile这里有

CFLAGS   = -g -Wall -lm
Run Code Online (Sandbox Code Playgroud)

C那个时候我在玩。现在我开始了C++,我必须添加-I eigen,快速 google 上它并发现CXXFLAGSC++世界而CFLAGS存在,而为C世界而存在。所以我更新Makefile

CFLAGS   = -g -Wall -lm
CXXFLAGS = -I eigen
Run Code Online (Sandbox Code Playgroud)

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

CFLAGS   = -g -Wall -lm
CXXFLAGS = ${CFLAGS} -I eigen
Run Code Online (Sandbox Code Playgroud)

完整的东西:

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

我要补充-I eigenCXXFLAGSCFLAGS

也注意到了 的存在CPPFLAGS

我应该改为$(CC) $(OBJS) $(CXXFLAGS) $(CPPFLAGS) -o $(PROGRAM) 还是$(CC) $(OBJS) -o $(PROGRAM)

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

还有其他改进吗?

眠りネ*_*ネロク 8

我会CFLAGS在编译 C 文件和CXXFLAGS编译 C++ 文件时使用。此外CFLAGSCXXFLAGS您可能在这里错过了另一个相关变量:CPPFLAGS.

我要补充-I eigenCXXFLAGSCFLAGS

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

CPPFLAGS = -I eigen
Run Code Online (Sandbox Code Playgroud)

另一个对提供库很有用的有趣变量是LDLIBS. 你可以利用它来传递-lm

LDLIBS = -lm
Run Code Online (Sandbox Code Playgroud)

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

我推荐的方法是通过编写不带配方的规则将头文件的先决条件添加到相应的目标文件中,例如:

main.o: main.h multiply.h ...
multiply.o: multiply.h ...
Run Code Online (Sandbox Code Playgroud)

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


Makefile 可能类似于:

CXXFLAGS = -g -Wall
CPPFLAGS = -I eigen
LDLIBS   = -lm
OBJS     = main.o multiply.o 
PROGRAM  = multitply

$(PROGRAM): $(OBJS)
   $(CXX) $^ $(LDLIBS) -o $@
Run Code Online (Sandbox Code Playgroud)

无需重复$(PROGRAM)$(OBJS)在配方中,您可以简单地分别使用自动变量$@$^