【发布时间】:2017-12-21 20:52:16
【问题描述】:
我一直在尝试自学 SFML。最近我一直在关注这个教程:http://gamecodeschool.com/sfml/building-a-simple-game-engine-in-c-plus-plus/ 来构建一个小小的乒乓球游戏。第一次尝试,我通读了所有内容并跟随了代码,并且不断收到 Bat 和 Ball 的错误,例如:
main.cxx:(.text+0x11e): undefined reference to `Bat::Bat(float, float)'
我回去尝试修复问题,并排比较代码,甚至重写每个文件。但是,我仍然不断收到相同的错误:
main.cxx:(.text+0x11e): undefined reference to `Bat::Bat(float, float)'
main.cxx:(.text+0x11e): undefined reference to `Bat::Bat(float, float)'
main.cxx:(.text+0x279): undefined reference to `Bat::moveLeft()'
等等
我了解未定义的引用意味着链接器在查看所有目标文件和库时无法找到定义。但是,我已经有一段时间没有使用 C++了,老实说,我似乎找不到哪里出错了?
我当前的环境是 Debian 9 上的 Geany IDE。所有的头文件和实现文件都在同一个文件夹中。该代码与上面发布的链接中的教程完全相同。例如,这是我的 Bat.h 文件:
ifndef BAT_H
#define BAT_H
#include <SFML/Graphics.hpp>
using namespace sf;
class Bat
{
private:
Vector2f position;
// A RectangleShape object
RectangleShape batShape;
float batSpeed = .3f;
public:
Bat(float startX, float startY);
FloatRect getPosition();
RectangleShape getShape();
void moveLeft();
void moveRight();
void update();
};
#endif
谁能指出我正确的方向或可能告诉我我做错了什么?我真的很感激。
谢谢。
【问题讨论】:
-
好吧,我们可以看到声明。定义呢?您是否还编译了相应的 cpp 文件(我猜是 Bat.cxx ?)并在您制作可执行文件时链接它?也许 cpp 文件没有正确添加到项目中(或者您的 IDE 使用的任何名称来引用用于构建可执行文件的源文件集合)?用这些信息很难说清楚。 (顺便说一句,你在第一行缺少一个 #,但我假设它在原始文件中,否则你肯定会有一个非常明确的错误)
-
对应的cpp文件我都编译好了,没问题。只有当我尝试构建时,我才会得到我所指的错误。
-
您是否尝试过编写自己的 Makefile 以确保您不会忘记某些内容(而不是使用您的 IDE)?当然,这更乏味,但至少更容易看出问题发生在哪里。或者,是否在终端工作?我认为这更多地与构建过程有关,而不是源文件中的内容,但是如果不确切知道你拥有什么以及你做了什么,真的很难说。
-
您的构建似乎缺少
Bat.o。