我试图找出makefile并且已经有一个项目目录,我想测试它。可悲的是,我似乎无法满足编译器的需求。 g ++警告我,我需要-std=c++11
标志,并进一步将错误打印到C ++ 11相关功能(如线程)。
我不知道自己做错了什么。
以下是第一行错误:
make
g++ -c -o Graphics.o Graphics.cpp
In file included from /usr/include/c++/5/thread:35:0,
from Graphics.h:4,
from Graphics.cpp:1:
/usr/include/c++/5/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
#error This file requires compiler and library support \
^
In file included from Graphics.cpp:1:0:
这里是Makefile:
csrc=$(wildcard *.c)
cppsrc=$(wildcard *.cpp)
obj=$(cppsrc:.cpp=.o) $(csrc:.c=.o)
CXXC = g++
#CXXCFLAGS = -std=c++14
EXEC = myprog
LOPENGL = -lGLEW -lGLM
LSFML = -lsfml-graphics -lsfml-window -lsfml-system
LDFLAGS = $(LSFML) $(LOPENGL)
all: $(obj)
$(CXXC) -std=c++11 $^ $(LDFLAGS) -o $(EXEC)
.PHONY: clean
clean:
rm .f $(obj)
我无法理解。互联网只是说"那么,添加标志然后"当我搜索错误。 我已经尝试过了:
切换旗帜的位置或直接在该行中书写(您可以通过评论CXXCFLAGS
实际看到这一点。)
使用不同的标记-std=c++11
,-std=gnu++11
,-std=c++14
我还注意到编译器运行时没有显示标志(要查看错误的第二行)。
另外,如果你能指出格式,其他错误或传统事物的任何问题,请务必留下评论,我渴望改进。
答案 0 :(得分:5)
你注释掉了相关的一行:
#CXXCFLAGS = -std=c++14
删除评论以使其有效。此外,变量拼写错误。它们的实际名称是CXX
和CXXFLAGS
(没有尾随/间歇C
!)。
您可能还需要指定处理C ++文件:
%.o: %.cpp
$(CXX) $(CXXFLAGS) -o $@ $<
解释错误:以下规则
all: $(obj)
$(CXXC) -std=c++11 $^ $(LDFLAGS) -o $(EXEC)
没有编译代码。相反,它链接 - 已编译的 - 对象文件(这是$(obj)
所指的)。但是要获取这些目标文件,需要编译源文件,make
正在使用implicit rule for .o
files。
- Makefile中有更多错误。例如,clean
规则应调用rm -f
而不是rm .f
。在编写代码时,你需要更加细致 。
答案 1 :(得分:0)
Konrad's answer解释了为什么你的g++
命令没有按照你想要的论点执行。
您可以使用make --print-data-base
来帮助您了解Make内置的规则。这里的相关内容是
%.o: %.cpp
# recipe to execute (built-in):
$(COMPILE.cpp) $(OUTPUT_OPTION) $<
这是从*.cpp
源文件生成目标文件的规则。根据{{1}}的定义,我们发现它回到了
COMPILE.cpp
所以我们只需要将我们的选项添加到COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
(不是CXXFLAGS
- 那是C预处理器,并与C语言共享):
CPPFLAGS
CXXFLAGS += -std=c++14
这是我们要复制的链接步骤,作为从目标文件生成可执行文件的命令。
还有其他几点需要注意:
%: %.cc
# recipe to execute (built-in):
$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@
目标永远不会创建名为all
的文件,因此即使可执行文件是最新的,也会发生链接步骤。all
进行您一直想要的诊断。-Wall
目标有拼写错误clean
,并且不会清除不再包含相应源文件的对象文件(即删除源时)。-f
删除编辑器备份文件。这是我改进的makefile版本:
clean