1

オブジェクトを Qt Plugin に渡す際に問題があり、const メンバー関数を使用してそのメンバーを取得しようとすると、シンボル ルックアップ エラーが発生します。例:

これはQtアプリケーション内にあります:

class A{
    int a,b,c;
}; 

class B{
public:
    const QList<A*>* a() const { return m_a; }
private:
    QList<A*>* m_a;
};

class C{
public:
    const B* b() const { return m_b; }
private:
    B* m_b;
};

これはQtPlugin内にあります:

plugin.h

#include "a.h"
#include "b.h"
#include "c.h"

//....

プラグイン.cpp

void Plugin::somefunc(C* c)
{
    qDebug() << c->b()->a()->count();
}

プラグインの Qt アプリケーション somefunc() から呼び出すと、シンボル ルックアップ エラーが発生します。

symbol lookup error ... plugin.so undefined symbol _ZNK5b6a

しかし、B および C クラスのメンバーをパブリック ドメインにすると、次のように動作します。

    qDebug() << c->m_b->m_a->count();

誰かが同様の問題を抱えているか、これを解決する方法を知っていますか? ありがとう。

4

2 に答える 2

1

デフォルトでは、クラス メンバーはプライベートです。B::a()プライベートC::b()です。これらのメンバー関数を呼び出せるようにPlugin::somefunc()するには、それらを明示的に公開する必要があります。

于 2012-11-13T09:33:32.800 に答える
1

この「問題」には 2 つの解決策があります。

  • 共有ライブラリを作成 - 共有ライブラリを作成し、アプリケーションと QtPlugin が使用するコードをそのライブラリに移動します
  • QMake ファイルに使用されるファイルの .h および .cpp を追加- QtPlugin で使用されるアプリケーションのヘッダーおよびソース ファイルを .pro ファイルの HEADERS および SOURCES ディレクティブに追加 - これは実際には静的リンクです

私はウェブ上で同様の質問を見つけていないので、この答えを出しています。質問が曖昧だったかもしれません、すみません。ご回答ありがとうございます。この回答は、将来の参照用です。

于 2012-11-19T16:41:27.817 に答える