【问题标题】:qt statically linked to a library -> symbol(s) not found for architecture x86_64qt 静态链接到库 -> 未找到架构 x86_64 的符号
【发布时间】:2012-06-26 10:18:33
【问题描述】:

我正在开发一个使用 qt 的静态库。 到目前为止,我能够静态构建 qt 源并将它们链接到我的库。一旦我尝试将库包含到主应用程序中(我使用 xcode 4 进行开发,将 libNTFramework.a 添加到我的构建阶段“将二进制文件与库链接”并将用户标头路径设置为框架标头),我得到了几个

架构 x86_64 的未定义符号:“vtable for NI::NT::ScriptApi::Fields”,引用自:libNTFramework.a(Fields.o) 中的 ScriptApi::Fields::Fields() 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;
  (...)
 }
(...)

【问题讨论】:

    标签: qt xcode4 static linker


    【解决方案1】:

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

    【讨论】:

    • 感谢您的提示。奇怪的是,当我使用动态链接的 qt 时,它的工作原理。我会用一些代码更新我的初始帖子。也许你看到了问题。
    • 是否有理由让 ctor 和 dtor 成为私有的?另外,您是否实现了这些插槽?
    • 原因是为了防止在除了朋友类组件管理器之外的任何其他类中创建字段。是的,插槽已实现。在我的初始帖子中查看我的更新。
    • @hitme 你找到问题所在了吗?我也有同样的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2020-09-09
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2015-05-31
    相关资源
    最近更新 更多