似乎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 $@ $<
此makefile的构建命令的输出为:
g++ -c -o main.o main.cpp
我不明白为什么它没有在输出中列出我的标志。此外,我知道它忽略了-std=c++11
标志,因为它抱怨非静态常量成员,并且它不应该启用该标志。
Edit0:符号更改
答案 0 :(得分:12)
您的.o:
规则未被选中,请将其更改为.cpp.o:
。
默认情况下(来自GNU make
doco):
n.o
自动从n.cc
,n.cpp
或n.C
自动制作,格式为'$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c'
您的规则在第一种情况下不起作用的原因是单后缀隐式规则应该是源类型而不是目标类型。因此规则将是.cpp:
(再次来自make
doco):
双后缀规则由一对后缀定义:目标后缀和源后缀。它匹配名称以目标后缀结尾的任何文件。通过使用文件名中的源后缀替换目标后缀来进行相应的隐式先决条件。目标和来源后缀为
'.o'
和'.c'
的双后缀规则等同于模式规则'%.o : %.c'
。单个后缀规则由单个后缀定义,后缀是 source 后缀。它匹配任何文件名,并通过附加源后缀来创建相应的隐式先决条件名称。源后缀为
'.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 $@
而且,如果你想使用隐式规则,你应该使用首选表单,这是较新的模式规则。它们比后缀更强大。