Dr *_*Deo 5 c++ qt linker-errors vtable
我正在尝试编写一个基本上像indianwebproxy一样工作的Http代理
所以我启动了qtcreator,但是我的一个类无法使用臭名昭着的错误进行编译:undefined reference to vtable for HttpProxyThreadBrowser
.我无法弄清楚为什么这样做.我在Stackoverflow上阅读了类似的问题,显然问题是未定义的虚拟方法不纯,但我还没有声明任何虚函数.这是我的课
class HttpProxyThreadBrowser : public QThread
{
public:
HttpProxyThreadBrowser(QTcpSocket outgoingSocket,QTcpSocket browserSocket,QObject *parent = 0);
~HttpProxyThreadBrowser(){};
void run();
private:
QTcpSocket outgoingSocket;
QTcpSocket browserSocket;
};
Run Code Online (Sandbox Code Playgroud)
我在这里用pastebin定义了这个类,以免给你带来烦恼.不幸的是,我无法找出为什么vtable未定义.请协助.
httpproxythreadbrowser.cpp:5: undefined reference to `vtable for HttpProxyThreadBrowser
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
Sim*_*ter 10
析构函数是隐式的,virtual
因为基类有一个虚拟的.
GNU编译器发出vtable以及第一个非内联虚拟方法("密钥方法").由于您的d'tor是在类中定义的,因此它是隐式虚拟的,并且由于没有其他虚拟方法,因此您没有密钥方法.
没有用例,其中具体类只有虚拟内联方法,因为它们只能内联到派生类中.
我将dtor的定义移动到实现文件中.
我不确定你是否也需要在moc
这里使用,或者如果QThread
没有衍生工具(IIRC你只需要它用于Qt的转换操作符,以及信号/插槽).
您无法复制QTcpSocket
s,因此如果您尝试通过副本而不是地址传递它们,可能会导致其他神秘错误。
HttpProxyThreadBrowser(QTcpSocket * outgoingSocket,QTcpSocket * browserSocket,QObject *parent = 0);
private:
QTcpSocket* outgoingSocket;
QTcpSocket* browserSocket;
Run Code Online (Sandbox Code Playgroud)
当您更改头文件时,完全重新编译您的项目可能会有所帮助,因为 qmake 生成的 Makefile 有时无法注意到更改。