我使用以下makefile来构建我的项目:
CC = /usr/bin/g++
CFLAGS = -Wall -pedantic -std=c++0x
LDFLAGS =
OBJ = main.o pnmhandler.o pixmap.o color.o
pnm: $(OBJ)
$(CC) $(CFLAGS) -o pnm $(OBJ) $(LDFLAGS)
%.o: %.c
$(CC) $(CFLAGS) -c $<
当我运行make时,我收到以下错误:
/ usr / include / c ++ / 4.9.1 / bits / c ++ 0x_warning.h:32:2:错误:#error这 文件需要ISO C ++ 2011的编译器和库支持 标准。此支持目前是实验性的,必须启用 使用-std = c ++ 11或-std = gnu ++ 11编译器选项。
正如我可以从以下内容中读到的那样,CFLAGS没有正确包含在内,但我不知道我做错了什么:
g ++ -c -o main.o main.cpp
还尝试了-std=c++11
和-std=gnu++11
,没有任何结果。有什么想法吗?
如果我运行make -Bn
,我会:
g++ -c -o main.o main.cpp
g++ -c -o pnmhandler.o pnmhandler.cpp
g++ -c -o pixmap.o pixmap.cpp
g++ -c -o color.o color.cpp
/usr/bin/g++ -Wall -pedantic -std=c++0x -o pnm main.o pnmhandler.o pixmap.o color.o
编辑:用%.o: %.c
替换规则%.o: %.cpp
可解决我的问题。
答案 0 :(得分:3)
你看到的原因
g++ -c -o main.o main.cpp
是Make正在调用其标准规则来创建目标文件:
%.o: %.cpp
# recipe to execute (built-in):
$(COMPILE.cpp) $(OUTPUT_OPTION) $<
该命令扩展为
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<
您应该设置CC
和CFLAGS
,而不是在您的makefile中设置CXX
和CXXFLAGS
,而不是使用C语言而不是C语言。在上面的规则为你工作,然后你只需要确保使用正确的链接器,例如与
pnm: LINK.o=$(LINK.cc)
pnm: $(OBJ)
您也不需要%.o: %.c
规则,因为您没有C来源。
完成Makefile:
CXX = /usr/bin/g++
CXXFLAGS = -Wall -pedantic -std=c++0x
OBJ = main.o pnmhandler.o pixmap.o color.o
pnm: LINK.o=$(LINK.cc)
pnm: $(OBJ)
clean::
$(RM) pnm
.PHONY: clean