undefined reference to `vtable...の対処

こんなエラーが出た

../opengl/debug/libgldriver.a(opengl.o):opengl.cpp:(.text$_ZN6opengl5JointD1Ev[opengl::Joint::~Joint()]+0x3a): undefined reference to `vtable for opengl::Joint'

こうなっていたのを

class IJoint
{
省略(virtualのインターフェースを宣言している)
};

class Joint : public IJoint
{
省略
};


ベースクラスのほうに追加する

class IJoint
{
// opengl::Joint::~Joint()のエラー
virtual ~IJoint(){}
};

と追加したらなおった。
どういう基準で必要になるのかよくわからないが対処として。

もうひとつの罠

単に

/home/focke/work/OpenGL/libpolymesh/opengl/joint.cpp:7: undefined reference to `vtable for opengl::Joint'

とエラーメッセージが出てどの仮想関数が無いと書いてない場合があって半日悶絶。
結局、仮想関数を継承した方のクラスの実装をすべてヘッダに書いた状態でスタティックライブラリにしていたのがよくなかった。
行儀よくヘッダとソースを分けて書かないからこうなる。
また、新たな地雷を開拓してしまったのです。

// joint.h
class Joint : public IJoint
{
// 非virtualのコンストラクタだけjoint.cppに書いている
Joint();
// virtual関数の実装をこんな感じで全部ヘッダに書いている
void setName(const std::string &name){ name_=name; }
std::string getName()const { return name_; }
};
// これをスタティックライブラリにするとvtableができない?

こんな感じのをスタティックライブリにしてリンクすると、スタティックライブラリのビルドは通るがリンクするときに怒られる。
さすがc++だ・・・。