传递给qt插件的对象的调用方法会产生符号查找错误

时间:2012-11-13 09:25:46

标签: c++ qt plugins

我有一个问题,将对象传递给Qt插件,当尝试使用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"

//....

plugin.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();

有没有人有类似的问题或知道如何解决这个问题?感谢。

2 个答案:

答案 0 :(得分:1)

默认情况下,类成员是私有的。 B::a()C::b()是私有的。为了能够从Plugin::somefunc()调用这些成员函数,您需要明确公开它们。

答案 1 :(得分:1)

这个“问题”有两种解决方案。

  • 制作共享库 - 制作共享库并将应用程序和QtPlugin使用的代码移动到该库中
  • 添加用于QMake文件的文件的.h和.cpp - QtPlugin中使用的应用程序的头文件和源文件添加到.pro文件中的HEADERS和SOURCES指令 - 这实际上是静态链接

我在网上找不到类似的问题,从而得出了这个答案。也许问题很模糊,抱歉。谢谢你的回答。这个答案可供将来参考。