0

私はqtを使用する静的ライブラリに取り組んでいます。これまでのところ、qt ソースを静的にビルドしてライブラリにリンクすることができました。ライブラリをメイン アプリケーションにインクルードしようとするとすぐに (開発に xcode 4 を使用し、ビルド フェーズに libNTFramework.a を追加し、「バイナリをライブラリにリンク」し、ユーザー ヘッダー パスをフレームワーク ヘッダーに設定します)。

アーキテクチャ x86_64 の未定義シンボル: 「NI::NT::ScriptApi::Fields の vtable」、参照先: libNTFramework.a(Fields.o) の ScriptApi::Fields::Fields() ScriptApi::Fields::~Fields () in libNTFramework.a(Fields.o) 注: 通常、vtable が見つからないということは、最初の非インライン仮想メンバー関数に定義がないことを意味します。(…) ld: アーキテクチャ x86_64 のシンボルが見つかりません

エラー。動的に構築されたqtを使用すると、エラーは発生しません。を使用してライブラリをチェックする

リポ -info libNTFramework.a

出力は、x86_64 アーキテクチャに対してすべてが正常に構築されていることを示しています。

非脂肪ファイル: libNTFramework.a はアーキテクチャ: x86_64

私が見逃しているアイデアはありますか?事前にt​​hx!

更新: ここにいくつかのコードがあります... fields は、フレンド クラスの componentmanager によって作成および「管理」されるシングルトン オブジェクトです。

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 に答える