2

我为我的应用程序类使用外部变量,因此我可以将类函数转发给 glutDisplayFunction(funcPtr)。

主.cpp:

#include "main.hpp"

int main(int argc, char** argv)
{
  gApp = new GameApp();
  return 0;
}

主.hpp:

#ifndef MAIN_HPP
#define MAIN_HPP
  #include "GameApp.hpp"
#endif

游戏应用程序.hpp:

#include <GL/gl.h>
#include <GL/freeglut.h>

class GameApp
{
  public:
  int running;

  GameApp();
  virtual ~GameApp();
  void resize(int width, int height);
  void init(int argc, char** argv, int width, int height);
  void draw();
  void update();
  void key_input(unsigned char key, int x, int y);
};

extern GameApp *gApp;

void display_clb()
{
  if (!gApp)
  {
    return;
  }

  gApp->draw();
}

这是输出:

g++     -o dist/Debug/GNU-Linux-x86/gravity build/Debug/GNU-Linux-x86/main.o build/Debug/GNU-Linux-x86/GBody.o build/Debug/GNU-Linux-x86/GameApp.o build/Debug/GNU-Linux-x86/GBodyList.o -lm -lGL -lglfw -lGLU -lglut 
build/Debug/GNU-Linux-x86/main.o: In function `main':
/home/viktor/Documents/cpp/Gravity/main.cpp:6: undefined reference to `gApp'
/home/viktor/Documents/cpp/Gravity/main.cpp:7: undefined reference to `gApp'
/home/viktor/Documents/cpp/Gravity/GameApp.cpp:13: undefined reference to `gApp'
/home/viktor/Documents/cpp/Gravity/GameApp.cpp:18: undefined reference to `gApp'
build/Debug/GNU-Linux-x86/GameApp.o: In function `display_clb()':
/home/viktor/Documents/cpp/Gravity/GameApp.cpp:23: undefined reference to `gApp'
build/Debug/GNU-Linux-x86/GameApp.o:/home/viktor/Documents/cpp/Gravity/GameApp.cpp:28: more undefined references to `gApp' follow
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/GNU-Linux-x86/gravity] Error 1
make[2]: Leaving directory `/home/viktor/Documents/cpp/Gravity'
make[1]: *** [.build-conf] Error 2
make[1]: Leaving directory `/home/viktor/Documents/cpp/Gravity'
make: *** [.build-impl] Error 2

我希望 gApp 在我的 main.cpp 和 GameApp 类中可见。

4

4 回答 4

8

这不是编译错误,而是链接错误。您的变量声明在 中可见main.cpp,但您没有在任何地方定义它 - 即您没有在任何地方为该变量分配空间。

您将需要一个(也正是一个)定义该变量的 C++ 文件。可能是你的main.cpp

GameApp *gApp;

(你也可以在那里初始化它,但在这种情况下没有必要。)

于 2012-05-25T10:40:28.387 回答
4

这告诉编译器有一个名为的变量gApp,但它是在其他地方定义的:

extern GameApp *gApp;

因为该定义不存在,所以链接器失败。

将以下内容添加到另一个(并且只有一个)源文件中:

GameApp *gApp;
于 2012-05-25T10:40:33.017 回答
2

使用extern,您告诉编译器该变量存在,但它位于其他位置。编译器认为您存在变量,并且

您所要做的就是在源代码的某处创建实际变量。你可以通过简单地添加类似GameApp *gApp;某处的东西来做到这一点。例如在您的 cpp 文件中。

于 2012-05-25T10:41:35.403 回答
0

和其他人之前的回答一样,你宣布了 gApp 的存在,但你实际上并没有提供它。

再补充一句:我建议你把gApp的定义放在一个“GameApp.cpp”文件中(不是GameApp.hpp),把它的声明放在一个“GameApp.h”文件里。

于 2012-05-25T10:56:35.243 回答