Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Linux上的命令行上编译QObject派生类_C++_Qt_Qobject_Qtcore_Moc - Fatal编程技术网

C++ 在Linux上的命令行上编译QObject派生类

C++ 在Linux上的命令行上编译QObject派生类,c++,qt,qobject,qtcore,moc,C++,Qt,Qobject,Qtcore,Moc,我是新来的。我正在尝试编译一个小代码段,如下所示: #include<QtCore/QtCore> #include<QtCore/QObject> class Test:public QObject { Q_OBJECT public: Test(){qDebug()<<"CTOR";} }; int main() { Test t; return 0; } 但是,我得到以下错误: undefined reference to vtable

我是新来的。我正在尝试编译一个小代码段,如下所示:

#include<QtCore/QtCore>
#include<QtCore/QObject>

class Test:public QObject
{
  Q_OBJECT
  public:
  Test(){qDebug()<<"CTOR";}
};

int main()
{
Test t;
return 0;
}
但是,我得到以下错误:

undefined reference to vtable for Test

我想我需要包括
QObject
的库,但我不是很确定。有什么想法吗?

您没有使用元对象编译器aka。主运行中心,正确

源代码中有一个QObject,而不是标头,因此不需要将标头包含在qmake的
HEADERS
变量中,而是需要在源代码中包含生成的moc文件,如下所示

请注意,由于Q_对象提供的属性、信号和插槽,通常应将Q_对象宏添加到Q_对象中。这对于解决此问题不是绝对必要的,但如果您知道这一点,则更好

main.cpp 构建并运行
缺少指示qt在此文件上运行moc工具的
HEADERS+=main.cpp
。@MarekR:嗯,您不应该混淆头和源。还要注意,用户实际上使用的是命令行而不是qmake。我的答案也适用于此,很好。通常,头文件不是为作为主接口moc而设计的。这只是一种额外的便利。不要滥用它。:-)是的,我知道这是一种黑客行为,但如果您没有明确的头文件来支持需要moc工具的类,这是必要的。没有它,您的示例将无法运行。@MarekR:您是否确实尝试过运行它?它确实有效,而且应该很好。我恐怕你误解了什么。@Laszlo Papp我尝试了你的建议,但它在main.moc文件中也给出了wierd错误。是否有QObject的库。我已经按照你的建议创建了main.pro。我遇到了一些错误,比如main.moc:39:error:Test–尚未声明为main。moc:48:error:Test–尚未声明为mainmain.moc:48:错误:非成员函数–const QMetaObject*metaObject()不能在函数–const QMetaObject*metaObject()中包含cv限定符/usr/include/QtCore/qobject.h:@Laszlo Papp:--感谢您的帮助。我尝试过清洁的环境,效果很好。
undefined reference to vtable for Test
#include<QtCore/QtCore>
#include<QtCore/QObject>

class Test:public QObject
{
  Q_OBJECT
  public:
  Test(){qDebug()<<"CTOR";}
};

#include "main.moc" // <----- This will make it work

int main()
{
Test t;
return 0;
}
TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp
qmake && make