0

我正在开发一个使用 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;
  (...)
 }
(...)
4

1 回答 1

0

它与库的二进制架构无关。它告诉NI::NT::ScriptApi::Fields您库文件 ( libNTFramework.a) 中的类缺少其某些虚拟成员函数的定义(实现)。即您在标头中定义了一些虚拟成员函数,但没有实现它们。

于 2012-06-26T12:37:41.963 回答