我正在使用Code :: Blocks 8.02和mingw 5.1.6编译器.我在编译Qt项目时收到此错误:
C:\ Documents and Settings\Fuzz\Desktop\GUI\App_interface.cpp | 33 |未定义引用`vtable for AddressBook'
文件地址Book.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
Run Code Online (Sandbox Code Playgroud)
文件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"));
}
Run Code Online (Sandbox Code Playgroud)
小智 48
使用Qt Creator时:
blw*_*y10 44
警告:如果您已经有.pro文件,请不要这样做 - 您将丢失它!
为了自动确保生成所有moc cpp文件,您可以让qmake为您自动生成.pro文件,而不是自己编写.pro文件.
跑
qmake -project
Run Code Online (Sandbox Code Playgroud)
在项目目录中,qmake将扫描您的目录中的所有C++标头和源文件,以生成moc cpp文件.
Cal*_*itt 16
几乎可以肯定的是,您没有在生成的moc_AddressBook.cpp文件中编译或不链接.(它应该是为您生成的 - 您moc
在编译之前在代码上运行Qt ,对吧?)
为了更全面地回答,Q_OBJECT
宏发出信号Qt的moc
工具来创建一个额外的实现文件,其中包含支持QObject
元信息系统所需的代码.如果您有任何信号或插槽,它也可以为这些做一些事情.
另一种解决方案可能是删除Q_OBJECT
宏.您可能不希望这样做,但它可以帮助解决当前问题,并且对于您提供的代码并不是绝对必要的.
另外,我会注意到你的行:
#include "addressbook.h"
Run Code Online (Sandbox Code Playgroud)
应该是:
#include "AddressBook.h"
Run Code Online (Sandbox Code Playgroud)
根据您在问题中呈现文件名的方式.
假设您使用qmake生成Makefile,请确保在.pro文件的HEADERS变量中指定AddressBook.h,例如
HEADERS = AddressBook.h
Run Code Online (Sandbox Code Playgroud)
对于 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)
Run Code Online (Sandbox Code Playgroud)