0

我有一个游戏程序,我感到非常沮丧。一切运行良好,我决定通过为每组函数创建单独的文件来清理我的程序。代码很长,包含多个文件,但基本思想如下:

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

在我的entity.hIve 中,我为该类声明了所有函数和变量。在我的entity.cppIve 中,以及在我的所有其他文件中。但是我仍然收到大量错误,这些错误告诉我,我对 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)”的引用

是的,我确实有一个objectof entity

4

4 回答 4

3

Undefined reference错误发生在链接时(而不是编译时)。您的代码似乎编译正确,因此您的标头可能是正确的。但是您并没有将所有内容链接在一起以生成可执行文件。您没有提到平台、编译器或构建系统,所以我无法确切告诉您如何修复它,但通常编译器会*.o为每个文件生成一个*.cpp文件(即编译),然后将*.o文件链接到创建一个可执行文件。您需要确保所有*.o文件都链接在一起(另外,您可能没有将其中一个文件编译*.cpp*.o文件)。

于 2012-10-13T20:06:42.563 回答
1

快速猜测一下,您没有将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 中添加文件时,并且在您看到应该添加文件的目标的复选框的位置,您应该确保选中新文件所属的所有目标。向导的默认设置是不选中所有复选框。在您的情况下,因为它是一个简单的项目,您应该确保检查每个目标(通常它会以调试和发布作为两个目标开始)。

于 2012-10-13T20:04:32.533 回答
1

我有同样的问题。对我来说,解决方案是:当您在项目中添加文件时,不要忘记单击“添加到调试”和“添加到发布”,文件将在项目树中是的,但是您将出现错误“未定义”参考”

于 2022-02-07T11:10:34.340 回答
0

问题是您最初定义的是一个名为的自由函数print,而不是一个名为class的成员函数。您需要在类的范围内将其定义为成员函数,这就是我在下面使用范围解析运算符所做的。printentityentity ::

/////vvvvvvvv
void entity::print(string f) {  //note the scope resolution operator:: used here
 cout<<f<<endl;
}
于 2022-02-07T11:17:15.447 回答