未定义的引用错误在其他文件中起作用

时间:2012-10-13 19:58:04

标签: c++ class include codeblocks

我有一个游戏程序,我非常沮丧。一切都运行良好,我决定通过为每组功能制作单独的文件来清理我的程序。代码很长,包含多个文件,但这是基本的想法:

我在Windows XP上使用Code :: Blocks IDE

在我的entity.h中,Ive声明了该类的所有函数和变量。在我的entity.cpp我已经包含它,以及我的所有其他文件。但我仍然得到一个巨大的错误列表,告诉我我对entity.h中的所有方法以及我所有其他头文件都有一个未定义的引用。例如,我有一个函数调用print(),以便更容易打印出来,这就是我从entity.h文件调用的第一个方法。我收到这个错误:

下面是print()的代码:

void print(string f) {
 cout<<f<<endl;
} 

我如何称呼它:

void Player::win(){
entity e;
e.print("You have defeated the orc");

} 错误:

  

在函数'ZN6Player3winEv'中:    对'entity :: print(std :: string)'

的未定义引用

是的,我确实有object entity

2 个答案:

答案 0 :(得分:0)

快速猜测,您没有将entity.o文件链接到二进制文件。

如果你使用的是linux g ++,那么就像:

g++ -o binary entity.cpp game.cpp

应该编译cpp文件并将其链接到二进制文件。

Code::Blocks选择特定构建组中的文件,您需要右键单击目标应用程序并选择properties。这将弹出Project/target options。转到Build Targets标签。在页面的右下方是Build target files的列表。您需要确保将所有可执行文件的文件选择为构建目标的一部分。这意味着您需要在entity.cpp文件上有一个复选框。这可确保编译包含entity::print代码的文件并将其链接到目标可执行文件中。请注意,Build target files标签适用于左侧列表中的所选build target。您需要确保检查该文件是否属于它所属的所有build targets

通常,当您在Code :: Blocks中添加文件时,如果您看到应该添加文件的目标的复选框,则应确保新文件属于的所有目标检查。向导的默认设置是取消选中所有复选框。在您的情况下,因为它是一个简单的项目,您应该确保为每个目标检查它(通常它将以调试和释放作为两个目标开始)。

答案 1 :(得分:0)

Undefined reference错误发生在链接时(与编译时相反)。您的代码似乎正在正确编译,因此您的标题可能正确。但是你并没有把所有东西连在一起来制作可执行文件。您没有提到平台,编译器或构建系统,因此我无法确切地告诉您如何修复它,但通常编译器会为每个*.o文件生成*.cpp文件(这是编译)然后将*.o文件链接在一起以创建可执行文件。您需要确保所有*.o个文件都链接在一起(另外,您可能没有将*.cpp个文件编译成*.o文件。