MinGWとgccの環境でOpenGL+SDLのゲームを開発しています。
複数のディレクトリで構成されているコード群のコンパイルで躓いています。
コンパイル対象のソースツリーは下のような感じになっています。
/src
/archive
/Archiver.h
/ArcSave.cpp
/ArcLoad.cpp
/core
/Main.cpp
/Main.h
/graphic
/Texture.h
/Texture.cpp
.
.
.
これらに対して、g++ -c /xxx/xxx.cppでコンパイルし、オブジェクトファイルから実行ファイルを生成しています。
コンパイルは全部通るのですが、実行ファイル生成する時に
Main.o:Main.cpp:(.text$_ZN4CObjC1Ev[CObj::CObj()]+0x22): undefined reference to
`vtable for CObj'
とでました。
ヘッダファイルにCObjを定義したCObject.hをMain.cppがインクルードしているのに、何故??と対策がわかりません。
何か気づくことがあったら教えて下さい。
よろしくお願いします。
g++コンパイルのundefined referenceを解決したい
Re: g++コンパイルのundefined referenceを解決したい
ソースファイル群の階層構造も大事な情報であるとは思いますが、
それよりももっと大事なのは、当該のソースファイルの中身(とりあえずMain.cppとCObject.h)であるような気がします。
それよりももっと大事なのは、当該のソースファイルの中身(とりあえずMain.cppとCObject.h)であるような気がします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: g++コンパイルのundefined referenceを解決したい
externはしているが実体を定義しそこねている、とかそういう理由では?
-
garon
Re: g++コンパイルのundefined referenceを解決したい
>boxさん
すいません、大事な情報が抜けてました。
コードは次の通りです。
すいません、大事な情報が抜けてました。
コードは次の通りです。
/*===================================================================
object.h
===================================================================*/
#ifndef OBJECTH
#define OBJECTH
#include "Main.h"
class CObj : public CTask {
public:
CObj() : CTask(Game->ObjList){}
// add,delete tasklist
void* operator new(size_t t) { return operator_new(t, Game->ObjList); }
void operator delete(void* p) { operator_delete(p, Game->ObjList); }
// action
virtual bool Move();
// display
virtual void Draw();
};
#endif
/*===================================================================
main.cpp
===================================================================*/
#include <stdio.h>
#include "Object.h"
CGame *Game;
// test
int main(int argc , char **argv ) {
Game = new CGame("TEST");
new CObj();
delete Game;
return 0;
}
/*===================================================================
main.h
===================================================================*/
#ifndef MAINH
#define MAINH
#include "../system/System.h"
extern CGame *Game;
#endif
/*===================================================================
system.h
===================================================================*/
#ifndef SYSTEMH
#define SYSTEMH
#include <SDL.h>
#include "../graphic/Texture.h"
#include "Core.h"
class CGame {
protected:
SDL_Surface* Screen;
void Init(const char *window_title);
public:
// constructor
CGame( const char *window_title );
// destructor
~CGame();
void Move();
void Draw();
void MainLoop();
CTexture *Text;
// task
CTaskList *ObjList;
// task system
void MoveTask(CTaskList* list);
void DrawTask(CTaskList* list);
};
#endif
Re: g++コンパイルのundefined referenceを解決したい
CTaskの定義はどこにあるのでしょうか。
想像ですが CTask に仮想デストラクタを実装してないのではありませんか?
想像ですが CTask に仮想デストラクタを実装してないのではありませんか?
-
garon
Re: g++コンパイルのundefined referenceを解決したい
>beatleさん
CTaskはCore.hに記述してあり、内容は次の通りです。
CTaskはCore.hに記述してあり、内容は次の通りです。
/*=======================================================================
task
=======================================================================*/
class CTask {
friend class CTaskList;
friend class CTaskIter;
CTaskList* TaskList;
// pointer to task list
CTask *Prev, *Next;
// disable new,delete not specified tasklist
void* operator new(size_t t) {}
void operator delete(void* p) {}
public:
// define new,delete if inherited
static void* operator_new(size_t t, CTaskList* task_list);
static void operator_delete(void* p, CTaskList* task_list);
CTask(CTaskList* task_list);
virtual ~CTask();
// act
virtual bool Move(){ return true; }
// display
virtual void Draw(){}
};
Re: g++コンパイルのundefined referenceを解決したい
CTask::~CTask()の実体を定義していますか?
参考 : undefined reference to vtable
参考 : undefined reference to vtable
-
garon
Re: g++コンパイルのundefined referenceを解決したい
問題を自己解決できました。
原因は、コンパイル済みオブジェクトファイルのリンクミスによるものでした。
実行ファイルを生成する時に、Object.oをリンクするよう記述していなかったのが原因で、それを足したら動きました。
ありがとうございました!
原因は、コンパイル済みオブジェクトファイルのリンクミスによるものでした。
実行ファイルを生成する時に、Object.oをリンクするよう記述していなかったのが原因で、それを足したら動きました。
この参考をきっかけに、ググっている最中に似たケースを見つけ、解決に至りました。beatle さんが書きました:CTask::~CTask()の実体を定義していますか?
参考 : undefined reference to vtable
ありがとうございました!