إشارة غير محددة إلى VTable. محاولة تجميع مشروع QT

StackOverflow https://stackoverflow.com/questions/1552069

  •  20-09-2019
  •  | 
  •  

سؤال

أنا استخدم الكود :: الكتل 8.02 و Mingw 5.1.6 مترجم. أحصل على هذا الخطأ عندما أقوم بتجميع مشروع QT الخاص بي:

C: المستندات والإعدادات The Fuzz Desktop GUI APP_INTERFACE.CPP | 33 | مرجع غير محدد إلى `vtable for adgbook '

ملف addressbook.h:

 #ifndef ADDRESSBOOK_H
 #define ADDRESSBOOK_H

 #include <QWidget>

 class QLabel;
 class QLineEdit;
 class QTextEdit;

 class AddressBook : public QWidget
 {
     Q_OBJECT

 public:
     AddressBook(QWidget *parent = 0);

 private:
     QLineEdit *nameLine;
     QTextEdit *addressText;
 };

 #endif

ملف addressbook.cpp:

#include <QtGui>
#include "addressbook.h"

AddressBook::AddressBook(QWidget *parent)
     : QWidget(parent)
{
    QLabel *nameLabel = new QLabel(tr("Name:"));
    nameLine = new QLineEdit;

    QLabel *addressLabel = new QLabel(tr("Address:"));
    addressText = new QTextEdit;

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget(nameLabel, 0, 0);
    mainLayout->addWidget(nameLine, 0, 1);
    mainLayout->addWidget(addressLabel, 1, 0, Qt::AlignTop);
    mainLayout->addWidget(addressText, 1, 1);

    setLayout(mainLayout);
    setWindowTitle(tr("Simple Address Book"));
}
هل كانت مفيدة؟

المحلول

تحذير: لا تفعل هذا إذا كان لديك بالفعل ملف .pro - ستفقده!

من أجل التأكد تلقائيًا يتم إنشاء جميع ملفات MOC CPP ، يمكنك الحصول على QMake لإنشاء ملف .pro تلقائيًا بدلاً من كتابة واحدة بنفسك.

يركض

qmake -project

في دليل المشروع ، وسيقوم QMake بمسح الدليل الخاص بك لجميع رؤوس C ++ وملفات المصدر لإنشاء ملفات MOC CPP لـ.

نصائح أخرى

عند استخدام QT Creator:

  1. بناء → تشغيل Qmake
  2. بناء → إعادة بناء الكل

من المؤكد أنك لا تقوم بتجميع أو عدم ربط ملف moc_addressbook.cpp الذي تم إنشاؤه. (يجب أن يكون قد تم إنشاؤه من أجلك - أنت تقوم بتشغيل QT's moc على الكود الخاص بك قبل التجميع ، أليس كذلك؟)

للإجابة بشكل أكثر شمولية ، Q_OBJECT إشارات الماكرو كيو تي moc أداة لإنشاء ملف تنفيذ إضافي يحتوي على الكود اللازم لدعمه QObjectنظام المعلومات الوصفية. إذا كان لديك أي إشارات أو فتحات ، فستفعل بعض الأشياء لمن هم أيضًا.

قد يكون الحل البديل هو إزالة Q_OBJECT دقيق. ربما لا ترغب في القيام بذلك ، ولكنه سيساعد على المشكلة الفورية ، وليس من الضروري تمامًا مع الكود الذي قدمته.

أيضا ، أود أن أشير إلى أن خطك:

#include "addressbook.h"

ربما يجب أن يكون:

#include "AddressBook.h"

بناءً على كيفية تقديم أسماء الملفات في السؤال.

على افتراض أنك تستخدم QMake لإنشاء Makefile الخاص بك ، تأكد من أن addressbook.h محدد في متغير رأس ملف .pro الخاص بك ، على سبيل المثال

HEADERS = AddressBook.h

حصلت على هذا أثناء استخدام وظائف افتراضية نقية. علي سبيل المثال،

virtual void process();

أعطى هذا الخطأ ، بينما

virtual void process() = 0;

جعلها تختفي.

لأي شخص يتوهج هذه المشكلة ، تحقق من تحديد جميع الوظائف الافتراضية. (عبر "= 0" أو تعريف كامل في الملف المصدر) أنا أستخدم NetBeans مع برنامج التحويل البرمجي Mingw.

بالنسبة لمشاريع CMake ، قم بتعيين CMake_Automoc على ON ، وهذا إصلاح مشكلتي.

#Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)

واجهت نفس المشكلة ، لكن بمجرد تحديد مُنشئي في ملف الرأس بدلاً من .CPP اختفى الخطأ. كما كان ملف MOC المقابل مفقودًا في نظام الملفات وفي قسم MakeFile "Compiler_Moc_header_make_all". ركضت Qmake ثم أخيرًا كل شيء مبني على النجاح. ذهبت للتحقق من Makefile وكان هناك الآن.

حذف مجلد البناء ، وأعد تشغيل QT Creator وعمل

لقد جئت إلى نفس المشكلة ، وأعيد بناء المشروع أبدًا على تحديث Makefile ، وأزيل Makefile وإعادة البناء ، وذهبت المشكلة. ملاحظة: قد يمنحك تشغيل "Make" من سطر الأوامر معلومات تفصيلية من IDE ، ومفيد للحصول على المشكلة الحقيقية.

أحد الأسباب هو عندما تعلن وظائف افتراضية في الفصل ولا تحدد أجسامهم.

في حالتي ، لم يكن كل شيء كافياً ، اضطررت إلى حذف دليل البناء وجعل إعادة بناء كل شيء - ثم نجحت!

انتقل إلى ملف .pro وتأكد من أن ملف .H قد تم تضمينه قبل ذلك. رؤوس += تضمين/file.h include/file2.h

واجهت نفس المشكلة في محاولة لاستخدام وظيفة افتراضية محمية. عمل شيئان.

  1. التغيير void process(); ل void process() = 0;
  2. تحضير process() الجمهور بدلا من القطاع الخاص

ستحصل على نفس رسالة الخطأ إذا قمت بإضافة نموذج أولي للتدمير بطريق الخطأ. أضف تعريفًا فارغًا للتدمير أو قم بإزالة النموذج الأولي.

ببساطة Run qmake لمشروعك. يمكن بسهولة القيام بذلك عن طريق النقر بزر الماوس الأيمن على اسم مشروعك والنقر فوق Run qmake.

يجب أن تكون ملفات الرأس لتجميع MOC موجودة في الرؤوس += ... متغير:

لقد قمت بنقل ملفات الرأس في myproject.pro إلى القسم += ... لأنني أريد أن أحصل على mysource.h و mysource.cpp في نفس عنصر الشجرة. ولكن هذا هو معيب لمبدع كيو تي. في النتيجة ، حدث خطأ "إشارة غير محددة إلى VTable". يبدو أن: QT يكتشف رأسًا لتجميع MOC فقط في الرؤوس += ... القسم (أو المتغير). انظر أيضا التفسير الصحيح في إجابة stackoverflow أخرى الثاني أنور "لقد رأيت الكثير من الطرق لحل المشكلة ، ولكن لا يوجد تفسير لسبب حدوثها ، لذلك يذهب هنا.". في رأيي ، هذا شرح بالضبط للمشكلة ، مما ساعدني على العثور على مشكلتي وحلها.

أنا أستخدم QT Creator لتجميع برامجي وتشغيلها ، لا أستخدمها موجه الأوامر QT غالباً. شيء واحد فعلته للتخلص من الخطأ المزعج "vtable شيء شيء"عن طريق إضافة الأسطر التالية إلى .pro ملف.

قالب = التطبيق

qt += core

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top