C++ 编译Qt hello World时对vtable的未定义引用
我设计了一个简单的窗口,只有一个按钮,并试图触发它。当我编译它的时候,我得到了一个错误,我真的不知道它是从哪里来的。当我编译一个简单的程序,但现在当我试图创建自己的图形用户界面使用QDesginer它不再工作。通常情况下,C++ 编译Qt hello World时对vtable的未定义引用,c++,qt,C++,Qt,我设计了一个简单的窗口,只有一个按钮,并试图触发它。当我编译它的时候,我得到了一个错误,我真的不知道它是从哪里来的。当我编译一个简单的程序,但现在当我试图创建自己的图形用户界面使用QDesginer它不再工作。通常情况下,vtable错误意味着某些虚拟函数没有实现,但我不知道这是什么原因造成的。我在这里看过类似的问题,比如或,但这并没有真正的帮助 main.cpp #include <QtWidgets/qapplication.h> #include <QtWidgets/q
vtable
错误意味着某些虚拟函数没有实现,但我不知道这是什么原因造成的。我在这里看过类似的问题,比如或,但这并没有真正的帮助
main.cpp
#include <QtWidgets/qapplication.h>
#include <QtWidgets/qpushbutton.h>
#include "main_frame.h"
class TestMainFrame : public QFrame
{
Q_OBJECT
public:
explicit TestMainFrame(QWidget *parent = 0);
~TestMainFrame();
private slots:
void onTest();
private:
Ui::MainFrameGUI *ui;
};
TestMainFrame::TestMainFrame(QWidget *parent) :
QFrame(parent),
ui(new Ui::MainFrameGUI)
{
ui->setupUi(this);
}
TestMainFrame::~TestMainFrame()
{
delete ui;
}
void TestMainFrame::onTest()
{
printf("Test\n");
}
int main( int argc, char **argv )
{
QApplication a(argc, argv);
TestMainFrame w;
w.show();
return a.exec();
}
build.log
d:\opt\qt-5.2.1\bin\uic.exe -g cpp -o d:\src\c\QTFrameQML\main_frame.h d:\src\c\QTFrameQML\main_frame.ui
g++.exe -std=c++11 -Wall -g -ID:\opt\qt-5.2.1\include -c d:\src\c\QTFrameQML\main.cpp -o Debug\obj\main.o
g++.exe -LD:\opt\qt-5.2.1\lib -o Debug\QTFrameQML.exe Debug\obj\main.o -lgdi32 -luser32 -lkernel32 -lcomctl32 -lQt5Core -lQt5Gui -lGLESv2d -lQt5Widgetsd -mwindows
Debug\obj\main.o: In function `ZN13TestMainFrameC2EP7QWidget':
d:/src/c/QTFrameQML/main.cpp:23: undefined reference to `vtable for TestMainFrame'
d:/src/c/QTFrameQML/main.cpp:23: undefined reference to `vtable for TestMainFrame'
Debug\obj\main.o: In function `ZN13TestMainFrameD2Ev':
d:/src/c/QTFrameQML/main.cpp:28: undefined reference to `vtable for TestMainFrame'
d:/src/c/QTFrameQML/main.cpp:28: undefined reference to `vtable for TestMainFrame'
collect2.exe: error: ld returned 1 exit status
这通常是一个依赖性问题,其中moc编译器由于已经存在的对象文件而未被调用。尝试清理您的环境并再次启动qmake。希望这有助于不要在cpp文件中使用Q_对象宏,除非您想手动运行moc。。。只需将您的类定义移动到main.h,将其包含在源代码中,然后重新运行qmake->works您是否在此项目上运行了
qmake
?顺便说一句,你能把项目文件也显示出来吗?我不使用qmake。我用明文W64编译QT开源软件,并在CODBROCK中创建了一个普通C++项目。正如我所说,当我编译一个简单的hellow world时,只要显示一个按钮,它就会工作。只有当我尝试开始使用这样的窗口时,才会出现此错误。您需要处理main.cpp。我不知道在windows上是怎么做的。在linux上,它是像moc main.cpp
@Devolus一样完成的,如果不使用qmake,如何创建moc文件?简单的hellowworld应用程序可能不需要mocables,它当然可以工作。我不知道我也必须使用moc
编译器,所以我将看看这个。谢谢你的提示。我没有使用qmake,但我错过的信息是,当使用Qt宏时,我必须使用moc
处理.h
文件。现在它起作用了。
d:\opt\qt-5.2.1\bin\uic.exe -g cpp -o d:\src\c\QTFrameQML\main_frame.h d:\src\c\QTFrameQML\main_frame.ui
g++.exe -std=c++11 -Wall -g -ID:\opt\qt-5.2.1\include -c d:\src\c\QTFrameQML\main.cpp -o Debug\obj\main.o
g++.exe -LD:\opt\qt-5.2.1\lib -o Debug\QTFrameQML.exe Debug\obj\main.o -lgdi32 -luser32 -lkernel32 -lcomctl32 -lQt5Core -lQt5Gui -lGLESv2d -lQt5Widgetsd -mwindows
Debug\obj\main.o: In function `ZN13TestMainFrameC2EP7QWidget':
d:/src/c/QTFrameQML/main.cpp:23: undefined reference to `vtable for TestMainFrame'
d:/src/c/QTFrameQML/main.cpp:23: undefined reference to `vtable for TestMainFrame'
Debug\obj\main.o: In function `ZN13TestMainFrameD2Ev':
d:/src/c/QTFrameQML/main.cpp:28: undefined reference to `vtable for TestMainFrame'
d:/src/c/QTFrameQML/main.cpp:28: undefined reference to `vtable for TestMainFrame'
collect2.exe: error: ld returned 1 exit status