我正在开发一个使用 qt 的静态库。到目前为止,我能够静态构建 qt 源并将它们链接到我的库。一旦我尝试将库包含到主应用程序中(我使用 xcode 4 进行开发,将 libNTFramework.a 添加到我的构建阶段“将二进制文件与库链接”并将用户头文件路径设置为框架头文件),我得到了几个
架构 x86_64 的未定义符号:“vtable for NI::NT::ScriptApi::Fields”,引用自:ScriptApi::Fields::Fields() in libNTFramework.a(Fields.o) ScriptApi::Fields::~Fields () in libNTFramework.a(Fields.o) 注意:缺少 vtable 通常意味着第一个非内联虚拟成员函数没有定义。(...) ld: 未找到架构 x86_64 的符号
错误。使用动态构建的 qt 时不会发生错误。通过使用检查我的图书馆
lipo -info libNTFramework.a
输出告诉我,一切都为 x86_64 架构构建得很好:
非胖文件:libNTFramework.a 是架构:x86_64
任何想法我错过了什么?提前谢谢!
更新:这里有一些代码......字段是由朋友类 coponentmanager 创建和“管理”的单例对象。
class Fields : public QObject
{
Q_OBJECT
friend class ComponentManager;
public:
QScriptValue scriptValue() const;
public slots:
void bind(const QString name, QScriptValue control);
void set(const QString name, const QVariant value);
QVariant get(const QString name) const;
private:
Fields();
virtual ~Fields();
QScriptValue m_scriptValue;
ComponentManager* const componentManager() const;
};
和
Fields::Fields()
{
}
Fields::~Fields()
{
}
QScriptValue Fields::scriptValue() const
{
return m_scriptValue;
}
void Fields::bind(const QString name, QScriptValue control)
{
try {
if (control.isQObject())
{
QWidget* widget = qobject_cast<QWidget*>(control.toQObject());
componentManager()->scriptableWizard()->currentPage()->registerField(name, widget);
}
else
{
throw new NonCriticalException(control.toString() + " does not represent a QObject");
}
} catch (...) {
}
}
void Fields::set(const QString name, const QVariant value)
{
componentManager()->scriptableWizard()->setField(name, value);
}
QVariant Fields::get(const QString name) const
{
return componentManager()->scriptableWizard()->field(name);
}
(...)
和
ComponentManager::ComponentManager(QScriptEngine* const engine,
ScriptableWizard* const wizard,
Application* const application) :
m_application(application),
m_scriptEngine(engine),
m_scriptableWizard(wizard)
{
s_instance = this;
m_scriptApiFields = new ScriptApi::Fields();
(...)
}
//! Delete the ComponentManager and all singletons created by it.
ComponentManager::~ComponentManager()
{
delete m_scriptApiFields;
(...)
}
(...)