1

我在将对象传递给 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 里面:

插件.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

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

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

我没有在网上找到类似的问题,因此提出了这个答案。也许问题很模糊,对此感到抱歉。感谢您的回答。此答案供将来参考。

于 2012-11-19T16:41:27.817 回答