我正在使用以下 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 $<
Run Code Online (Sandbox Code Playgroud)
当我运行 make 时,出现以下错误:
/usr/include/c++/4.9.1/bits/c++0x_warning.h:32:2: error: #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
Run Code Online (Sandbox Code Playgroud)
编辑:更换规则%.o: %.c与%.o: %.cpp修复我的问题。
你看到的原因
g++ -c -o main.o main.cpp
Run Code Online (Sandbox Code Playgroud)
是 Make 调用其标准规则来创建目标文件:
%.o: %.cpp
# recipe to execute (built-in):
$(COMPILE.cpp) $(OUTPUT_OPTION) $<
Run Code Online (Sandbox Code Playgroud)
该命令扩展为
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<
Run Code Online (Sandbox Code Playgroud)
而不是在你的makefile中设置CCand CFLAGS,你应该设置CXXand CXXFLAGS,这意味着 C++ 而不是 C。这允许上面的内置规则为你工作,然后你只需要确保使用正确的链接器,例如和
pnm: LINK.o=$(LINK.cc)
pnm: $(OBJ)
Run Code Online (Sandbox Code Playgroud)
您也不需要%.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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3294 次 |
| 最近记录: |