2

アプリケーションクラスにextern変数を使用して、クラス関数をglutDisplayFunction(funcPtr)に転送できるようにします。

main.cpp:

#include "main.hpp"

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

main.hpp:

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

GameApp.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++ファイルが1つ(そして正確に1つ)必要になります。おそらくあなたのmain.cpp

GameApp *gApp;

(その場で初期化することもできますが、この場合は必要ありません。)

于 2012-05-25T10:40:28.387 に答える
4

これは、コンパイラにという名前の変数があることを通知しgAppますが、それは別の場所で定義されています。

extern GameApp *gApp;

その定義が存在しないため、リンカは失敗します。

以下を別の(そして1つだけの)ソースファイルに追加します。

GameApp *gApp;
于 2012-05-25T10:40:33.017 に答える
2

を使用externして、変数が存在するが、それは別の場所にあることをコンパイラーに通知します。コンパイラは、変数が存在すると信じており、

あなたがしなければならないのは、ソースのどこかに実際の変数を作成することです。これは、どこかに何かを追加するだけで実行できますGameApp *gApp;。たとえば、cppファイルにあります。

于 2012-05-25T10:41:35.403 に答える
0

他の人からの以前の回答と同じように、あなたはgAppの存在を発表しましたが、実際にはそれを提供しませんでした。

もう1つ追加します。gAppの定義を(GameApp.hppではなく)「GameApp.cpp」ファイルに入れ、その宣言を「GameApp.h」ファイルに入れることをお勧めします。

于 2012-05-25T10:56:35.243 に答える