我正在学习数据结构,而且我一直试图找出这个错误超过一个小时!
在我的主要内容中,我打电话:
...
#include "Graph.hpp"
Graph* g = new Graph();
g->addVertex("vertex1");
...
在我的Graph.cpp中我有:
...
#include "Graph.hpp"
Vertex * Graph::addVertex( string name ) {
...
}
...
在我的Graph.hpp中:
...
class Graph{
Vertex *addVertex(string);
...
}
编译时我收到错误:
undefined reference to `Graph::addVertex(std::string)'
编辑:
makefile:
CC=g++
CXXFLAGS = -std=c++11 -O2 -g - Wall
LDFLAGS= -g
main: main.o
g++ -o main main.o
main.o: Edge.hpp Graph.hpp Vertex.hpp Graph.cpp
答案 0 :(得分:0)
您的类定义末尾缺少分号。这将导致接下来被视为该类类型的变量声明,而不是它应该是什么。在这种情况下,后来对“它应该是什么”的引用通常也会失败。
始终从遇到的第一个编译器错误开始。 IDE中的错误列表经常会混淆顺序,我建议查看实际的编译器输出。
答案 1 :(得分:0)
回答:此处:
main: main.o
g++ -o main main.o
您的可执行文件main
未与Graph.o
文件链接,因此会生成未定义的引用。
解决方案:
这是一个简单的Makefile,每次要在项目中添加新的.cpp文件时都不必修改它:
EXE := a.out # nexecutable name
SRC := $(wildcard *.cpp) # get a list of all the .cpp in the current directory
OBJ := $(SRC:.cpp=.o) # compile every .cpp file into a .o file
CXXFLAGS = -W -Wall -std=c++11 -O2
$(EXE): $(OBJ)
$(CXX) $(OBJ) -o $(EXE) # $(CXX) contains g++ by default
如果您希望Makefile对头文件修改做出反应:
EXE := a.out # executable name
SRC := $(wildcard *.cpp) # get a list of all the .cpp in the current directory
OBJ := $(SRC:.cpp=.o) # compile every .cpp file into a .o file
DEP := $(OBJ:.o=.d) # from every .o file create a .d file that will keep track of header files
CXXFLAGS = -W -Wall -std=c++11 -O2
CPPFLAGS = -MMD -MP # let g++ handles the header files dependencies for you
-include $(DEP) # includes the .d files into the Makefile
$(EXE): $(OBJ)
$(CXX) $(OBJ) -o $(EXE) # $(CXX) contains g++ by default