1

ライブラリ内のクラスから、ポインターを使用してメイン クラスのメンバー関数にアクセスしたいと考えています。

メインクラスの public 変数にアクセスできます。しかし、メンバー関数 (パブリック) にアクセスしようとすると、次のエラーが発生します。

./Panda: symbol lookup error: libkoala.so: undefined symbol: _ZNK5Panda6getLOLEv

理由は本当にわかりません.C ++の概念を理解していないのかもしれません...

私の主なクラス:

class           Panda
{
protected:
  IAssistant*   (*external_creator)();
  IAssistant*   lib;
  void*         dlhandle;

  int           lol;
public:

  int           hello;

  Panda();
  ~Panda();

  int           getLOL() const;
};

Panda::Panda()
{
  if ((dlhandle = dlopen("libkoala.so", RTLD_LAZY)) == NULL)
    exit(-1);
  if ((external_creator = reinterpret_cast<IAssistant* (*)()>(dlsym(dlhandle, "create_assistant"))) == NULL)
    exit(-1);
  lib = external_creator();
  lol = 69;
  hello = 42;
  lib->do_something(this);
}

Panda::~Panda(){
}

int                     Panda::getLOL() const
{
  return lol;
}

インターフェイスは次のようになります。

class IAssistant
{
public:
  virtual void do_something(Panda *) = 0;
};

そして私のlibのクラス:

class Koala : public IAssistant
{
public:
  void do_something(Panda *);
};

void Koala::do_something(Panda * ptr)
{
  std::cout << ptr->hello; <========= work perfectly 
  std::cout << ptr->getLOL(); <====== doesn't work
}

extern "C"
{
        IAssistant* create_assistant()
        {
                return new Koala();
        }
}

アイデアはありますか?

4

1 に答える 1

0

わかりました、問題はコンパイル中にありました。フラグ -rdynamic を追加すると、コードは完全に機能します。

于 2013-03-03T14:55:28.567 に答える