C++ 为什么';这个Makefile不能正确编译吗?
我有以下生成文件:C++ 为什么';这个Makefile不能正确编译吗?,c++,c++11,compiler-construction,C++,C++11,Compiler Construction,我有以下生成文件: CC=g++ CFLAGS=-c -pedantic -std=c++11 -lglfw -lGL -lGLU -lX11 -lXxf86vm -lXrandr -lpthread -lXi all: Set GLDrawableGraph Edge Graph Play main Set: Set.cpp Set.h $(CC) $(CFLAGS) -o Set Set.cpp GLDrawableGraph: GLDrawableGraph.cpp
CC=g++
CFLAGS=-c -pedantic -std=c++11 -lglfw -lGL -lGLU -lX11 -lXxf86vm -lXrandr -lpthread -lXi
all: Set GLDrawableGraph Edge Graph Play main
Set: Set.cpp Set.h
$(CC) $(CFLAGS) -o Set Set.cpp
GLDrawableGraph: GLDrawableGraph.cpp GLDrawableGraph.h Edge.h Graph.h
$(CC) $(CFLAGS) -o GLDrawableGraph GLDrawableGraph.cpp
Edge: Edge.cpp Edge.h
$(CC) $(CFLAGS) -o Edge Edge.cpp
Graph: Graph.cpp GLDrawableGraph.h Edge.h Graph.h Play.h
$(CC) $(CFLAGS) -o Graph Graph.cpp
Play: Play.cpp GLDrawableGraph.h Edge.h Graph.h Play.h
$(CC) $(CFLAGS) -o Play Play.cpp
main: main.cpp GLDrawableGraph.o Edge.o Graph.o Play.o GLDrawableGraph.h Edge.h Graph.h Play.h Set.o Set.h
$(CC) $(CFLAGS) -o main main.cpp GLDrawableGraph.cpp Edge.cpp Graph.cpp Play.cpp Set.cpp
我得到以下输出:
GLDrawableGraph.cpp:95:10: error: ‘p’ does not name a type
auto p=nodes.find(nodenumber);
^
GLDrawableGraph.cpp:96:8: error: ‘p’ was not declared in this scope
if(p==nodes.end()) throw std::string("Tried to color nonexistant vertex");
^
GLDrawableGraph.cpp:97:5: error: ‘p’ was not declared in this scope
p->second.color=col;
^
GLDrawableGraph.cpp: In member function ‘void DrawableGraph::DrawGraph(GLFWwindow*) const’:
GLDrawableGraph.cpp:140:15: error: ISO C++ forbids declaration of ‘e’ with no type [-fpermissive]
for(auto &e : edges) {
^
GLDrawableGraph.cpp:140:19: error: range-based ‘for’ loops are not allowed in C++98 mode
for(auto &e : edges) {
^
GLDrawableGraph.cpp:141:18: error: request for member ‘first’ in ‘e’, which is of non-class type ‘int’
int i1=e.first.first;
^
GLDrawableGraph.cpp:142:18: error: request for member ‘first’ in ‘e’, which is of non-class type ‘int’
int i2=e.first.second;
^
GLDrawableGraph.cpp:151:28: error: request for member ‘second’ in ‘e’, which is of non-class type ‘int’
RGB rgb=RGBColor(e.second.color);
^
GLDrawableGraph.cpp:158:15: error: ISO C++ forbids declaration of ‘p’ with no type [-fpermissive]
for(auto &p : nodes) {
^
GLDrawableGraph.cpp:158:19: error: range-based ‘for’ loops are not allowed in C++98 mode
for(auto &p : nodes) {
^
GLDrawableGraph.cpp:159:26: error: request for member ‘second’ in ‘p’, which is of non-class type ‘int’
float xx=float(p.second.x-R.l)/(R.r-R.l)*1.8-0.9;
^
GLDrawableGraph.cpp:160:26: error: request for member ‘second’ in ‘p’, which is of non-class type ‘int’
float yy=float(p.second.y-R.b)/(R.t-R.b)*1.8-0.9;
这些错误是从C++ 11与常规C++的区别所引起的,但是我已经给出了-STD= C++ 11选项,但仍然不起作用。< p>您的MaFaMeX依赖关系不正确。所发生的情况是,它使用内置规则编译您的项目,因此您的标志不适用,并且编译器无法识别C++11
auto
关键字。尝试使用make-r
编译以禁用内置规则,并查看发生了什么
你可能想要这样的东西:
CXX := g++
CPPLAGS := -Wall -Wextra
CXXFLAGS := -std=c++11
LDLIBS := -lglfw -lGL -lGLU -lX11 -lXxf86vm -lXrandr -lpthread -lXi
all : main
main : main.o GLDrawableGraph.o Edge.o Graph.o Play.o Set.o
${CXX} -o $@ $^ ${LDLIBS}
%.o : %.cpp # also auto-generates dependencies
${CXX} -c -o $@ ${CPPLAGS} ${CXXFLAGS} -MD -MP -MF ${@:.o=.d} $<
-include $(wildcard *.d) # include auto-generated dependencies
CXX:=g++
CPPLAGS:=-Wall-Wextra
CXXFLAGS:=-std=c++11
LDLIBS:=-lglfw-lGL-lGLU-lX11-lXxf86vm-lXrandr-lpthread-lXi
全部:主要
main:main.o GLDrawableGraph.o Edge.o Graph.o Play.o Set.o
${CXX}-o$@$^${LDLIBS}
%.o:%.cpp#还自动生成依赖项
${CXX}-c-o$@${CPPLAGS}${CXX}-MD-MP-MF${@:.o=.d}$<
-包含$(通配符*.d)#包含自动生成的依赖项
您使用的是什么版本的gcc?您想要的是CXXFLAGS,而不是g++的CFLAGS。也许在GLDrawableGraph.cpp的第95行附近显示代码将是一个很好的起点,至少在这一点上有问题的函数是这样的。。。什么是p
,为什么gcc
对其类型感到困惑@一般来说,这是对的,但是考虑到makefile
的编写方式,这可能不是本例中的问题…@twalberg,实际上使用$(cxflags)
可以解决这个问题,因为它将由用于构建GLDrawableGraph.o
的隐式规则拾取,所以在CFLAGS
中不包含-c
(或cxflags
)。它意味着只编译,从而防止链接。只将-c
添加到对象文件生成规则中。准确地说,主
目标将GLDrawableGraph.o
作为先决条件,但没有构建GLDrawableGraph.o
的方法,因此内置规则用于编译GLDrawableGraph.cpp
,它使用$(CXX)
和$(cxflags)
而不是$(CC)
和$(CFLAGS)
。上面的makefile修复了所有这些问题。