Makefile似乎忽略了标志.为什么?

HSc*_*ale 7 c++ makefile c++11

似乎make忽略了我的cflag选项,因为编译器抱怨我需要-std=c++11作为标志,但该选项包含在我的makefile中.

CC=g++
# Flags for the C compiler
CXX_FLAGS= \
    -Wall \
    -std=c++11 \
    -O2
# Linker Flags
LD_FLAGS= 

# Sources to compile
SOURCES=main.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXE=HolidayLights.out

all: $(SOURCES) $(EXE)

# Primary build target
$(EXE): $(OBJECTS)
    $(CC) $(LD_FLAGS) $(OBJECTS) -o $@

.o:
    $(CC) -c $(CXX_FLAGS) -o $@ $<
Run Code Online (Sandbox Code Playgroud)

此makefile的构建命令的输出是:

g++     -c -o main.o main.cpp
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它没有在输出中列出我的标志.此外,我知道它忽略了-std=c++11标志,因为它抱怨非静态常量成员,并且它不应该启用该标志.

Edit0:符号更改

pax*_*blo 12

您的.o:规则未被选中,请将其更改为.cpp.o:.

默认情况下(来自GNU makedoco):

n.o从自动进行n.cc,n.cppn.C与以下形式的配方'$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c'

您的规则在第一种情况下不起作用的原因是单后缀隐式规则应该是类型而不是目标类型.因此规则将是.cpp:(再次来自makedoco):

双后缀规则由一对后缀定义:目标后缀和源后缀.它匹配名称以目标后缀结尾的任何文件.通过使用文件名中的源后缀替换目标后缀来进行相应的隐式先决条件.一个双后缀规则,其目标和源后缀是'.o'并且'.c'等同于模式规则'%.o : %.c'.

单后缀规则由单个后缀定义,后缀是后缀.它匹配任何文件名,并通过附加源后缀来创建相应的隐式先决条件名称.源后缀为的单后缀规则'.c'等同于模式规则'% : %.c'.

但是,仔细阅读最后一句话.的.cpp:,如果你要打开的规则是唯一有效XYZZY.cpp进入XYZZY.由于您的目标是表单XYZZY.o,因此不会使用它.

当然,另一种选择是根本不触及默认规则,而只是修改它们使用的变量:

CXX      = g++
CPPFLAGS = -Wall -std=c++11 -O2
LD_FLAGS =

SOURCES  = main.cpp
OBJECTS  = $(SOURCES:.cpp=.o)
EXE      = HolidayLights.out

all: $(SOURCES) $(EXE)

$(EXE): $(OBJECTS)
    $(CXX) $(LD_FLAGS) $(OBJECTS) -o $@
Run Code Online (Sandbox Code Playgroud)

而且,如果您想使用隐式规则,您应该使用首选表单,这是较新的模式规则.它们比后缀更强大.