2013-05-14 89 views
1

我想从命令行编译单个文件QT应用程序,以快速测试某些功能。请参阅下面的文件的代码。从命令行编译Qt单个文件:undefined参考vtable

我与编译:

qmake -project && qmake && make 

而且我收到此错误:

Togglebutton.o:Togglebutton.cpp:function ButtonDialog::ButtonDialog(QWidget*): error: undefined reference to 'vtable for ButtonDialog' 
Togglebutton.o:Togglebutton.cpp:function ButtonDialog::ButtonDialog(QWidget*): error: undefined reference to 'vtable for ButtonDialog' 
Togglebutton.o:Togglebutton.cpp:function ButtonDialog::~ButtonDialog(): error: undefined reference to 'vtable for ButtonDialog' 
Togglebutton.o:Togglebutton.cpp:function ButtonDialog::~ButtonDialog(): error: undefined reference to 'vtable for ButtonDialog' 

我不是一个C++大师,我试图给Google未定义引用的vtable但我并不了解为什么我得到这个错误也与一个文件..

有人可以帮我解释未定义的Vtable错误?

/* 
* Copyright (c) 2006-2007, Johan Thelin 
* 
* All rights reserved. 
* 
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met: 
* 
*  * Redistributions of source code must retain the above copyright notice, 
*  this list of conditions and the following disclaimer. 
*  * Redistributions in binary form must reproduce the above copyright notice, 
*  this list of conditions and the following disclaimer in the documentation 
*  and/or other materials provided with the distribution. 
*  * Neither the name of APress nor the names of its contributors 
*  may be used to endorse or promote products derived from this software 
*  without specific prior written permission. 
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
* 
*/ 

#include <QPushButton> 
#include <QHBoxLayout> 
#include <QMessageBox> 

#include <QApplication> 
#include <QDialog> 
class QPushButton; 

class ButtonDialog : public QDialog 
{ 
    Q_OBJECT 

public: 
    ButtonDialog(QWidget *parent=0); 

private slots: 
    void buttonClicked(); 
    void buttonToggled(); 

private: 
    QPushButton *clickButton; 
    QPushButton *toggleButton; 
}; 

ButtonDialog::ButtonDialog(QWidget *parent) : QDialog(parent) 
{ 
    clickButton = new QPushButton("Click me!", this); 
    toggleButton = new QPushButton("Toggle me!", this); 
    toggleButton->setCheckable(true); 

    QHBoxLayout *layout = new QHBoxLayout(this); 
    layout->addWidget(clickButton); 
    layout->addWidget(toggleButton); 

    connect(clickButton, SIGNAL(clicked()), this, SLOT(buttonClicked())); 
    connect(toggleButton, SIGNAL(clicked()), this, SLOT(buttonToggled())); 
} 

void ButtonDialog::buttonClicked() 
{ 
    QMessageBox::information(this, "Clicked!", "The button was clicked!"); 
} 

void ButtonDialog::buttonToggled() 
{ 
    QMessageBox::information(this, "Toggled!", QString("The button is %1!").arg(toggleButton->isChecked()?"pressed":"released")); 
} 


int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 

    ButtonDialog dlg; 
    dlg.show(); 

    return app.exec(); 
} 
+0

可能的重复在http://stackoverflow.com/questions/4774291/q-object-throwing-undefined-reference-to-vtable-error?rq=1 – sashoalm 2013-05-14 14:15:34

回答

1

我有同样的错误,当我宣布CPP文件Q_OBJECT类。创建一个头并在那里移动类声明。

+0

真的没有机会编译一个qt最小项目只有一个文件?真?? – nkint 2013-05-14 14:05:08

+1

这个问题实际上是一个重复到http://stackoverflow.com/questions/4321590/c-undefined-reference-to-vtable,并且很久以前就已经回答了。最好是将其标记为重复。 – sashoalm 2013-05-14 14:06:11

+0

如果有 - 我不知道。抱歉。 – Amartel 2013-05-14 14:06:12