我正在使用qt的静态库。到目前为止,我能够静态构建qt源代码并将它们链接到我的库。只要我尝试将库包含到主应用程序中(我使用xcode 4进行开发,将libNTFramework.a添加到我的构建阶段“链接库与二进制文件”并将用户头路径设置为框架头)我得到几个qt静态链接到库 - >符号(s)没有找到架构x86_64
未定义的体系结构x86_64符号:“vtable for NI :: NT :: ScriptApi :: Fields”,引用来自:libNTFramework.a中的ScriptApi :: Fields :: Fields()(Fields.o)ScriptApi :: Fields ::〜libNTFramework.a(Fields.o)中的Fields()注意:缺少的vtable通常意味着第一个非内联虚拟成员函数没有定义。 (...) LD:符号(S)没有发现建筑x86_64的
错误。当使用动态构建的qt时,错误不会发生。 使用
脂-info libNTFramework.a
输出告诉我,一切都建立了良好的x86_64的拱检查我的库:
非脂文件:libNTFramework。 a是架构:x86_64
任何想法我失踪了? thx提前!
更新: 这是一些代码...字段是由朋友类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;
(...)
}
(...)
thx为您的提示。奇怪的是,它的工作原理,当我使用动态链接的QT。我会用一些代码更新我的初始文章。也许你会看到问题。 – hitme
ctor和dtor是否有私密性?另外,你是否实现了这些插槽? –
原因是为了防止在除friend类componentmanager之外的任何其他类中创建字段。是的,插槽已实施。在我的初始文章中看到我的更新。 – hitme