代码中未定义的函数引用

时间:2014-05-04 22:52:55

标签: c++ function reference undefined

我正在学习数据结构,而且我一直试图找出这个错误超过一个小时!

在我的主要内容中,我打电话:

...
#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

2 个答案:

答案 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