Qt+VS2017 QUdpSocket LINK2019错误
因为一直用VS+Qt, 习惯了VS的智能提示,没有用QtCreater做开发。这次做一个物联网模拟器,用了QUdpSocket来进行网络通信,一编译:
1>SimNodeSendThread.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: bool __cdecl QAbstractSocket::bind(class QHostAddress const &,unsigned short,class QFlags<enum QAbstractSocket::BindFlag>)" ([email protected]@@[email protected]@[email protected]@[email protected]@@@@Z),该符号在函数 "public: __cdecl SimNodeSendThread::SimNodeSendThread(unsigned int,unsigned short)" ([email protected]@[email protected]@Z) 中被引用
1>SimNodeSendThread.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl QHostAddress::QHostAddress(enum QHostAddress::SpecialAddress)" ([email protected]@[email protected]@[email protected]@Z),该符号在函数 "public: __cdecl SimNodeSendThread::SimNodeSendThread(unsigned int,unsigned short)" ([email protected]@[email protected]@Z) 中被引用
1>SimNodeSendThread.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl QHostAddress::~QHostAddress(void)" ([email protected]@[email protected]),该符号在函数 "public: __cdecl SimNodeSendThread::SimNodeSendThread(unsigned int,unsigned short)" ([email protected]@[email protected]@Z) 中被引用
1>SimNodeSendThread.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl QUdpSocket::QUdpSocket(class QObject *)" ([email protected]@[email protected]@@@Z),该符号在函数 "public: __cdecl SimNodeSendThread::SimNodeSendThread(unsigned int,unsigned short)" (??0SimNodeSe[email protected]@[email protected]@Z) 中被引用
1>SimNodeSendThread.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual __cdecl QUdpSocket::~QUdpSocket(void)" ([email protected]@[email protected]),该符号在函数 "public: virtual void * __cdecl QUdpSocket::`scalar deleting destructor'(unsigned int)" ([email protected]@[email protected]) 中被引用
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual bool __cdecl QAbstractSocket::atEnd(void)const " ([email protected]@@UEBA_NXZ)
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual __int64 __cdecl QAbstractSocket::bytesAvailable(void)const " ([email protected]@@UEBA_JXZ)
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual __int64 __cdecl QAbstractSocket::bytesToWrite(void)const " ([email protected]@@UEBA_JXZ)
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual bool __cdecl QAbstractSocket::canReadLine(void)const " ([email protected]@@UEBA_NXZ)
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual void __cdecl QAbstractSocket::close(void)" ([email protected]@@UEAAXXZ)
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual void __cdecl QAbstractSocket::connectToHost(class QHostAddress const &,unsigned short,class QFlags<enum QIODevice::OpenModeFlag>)" ([email protected]@@[email protected]@[email protected]@[email protected]@@@@Z)
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual void __cdecl QAbstractSocket::connectToHost(class QString const &,unsigned short,class QFlags<enum QIODevice::OpenModeFlag>,enum QAbstractSocket::NetworkLayerProtocol)" ([email protected]@@[email protected]@[email protected]@[email protected]@@@[email protected]@@Z)
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual void __cdecl QAbstractSocket::disconnectFromHost(void)" ([email protected]@@UEAAXXZ)
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual bool __cdecl QAbstractSocket::isSequential(void)const " ([email protected]@@UEBA_NXZ)
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl QUdpSocket::metaObject(void)const " ([email protected]@@[email protected]@XZ)
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual int __cdecl QUdpSocket::qt_metacall(enum QMetaObject::Call,int,void * *)" ([email protected]@@[email protected]@@[email protected])
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual void * __cdecl QUdpSocket::qt_metacast(char const *)" ([email protected]@@[email protected])
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "protected: virtual __int64 __cdecl QAbstractSocket::readData(char *,__int64)" ([email protected]@@[email protected])
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "protected: virtual __int64 __cdecl QAbstractSocket::readLineData(char *,__int64)" ([email protected]@@[email protected])
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual void __cdecl QAbstractSocket::resume(void)" ([email protected]@@UEAAXXZ)
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual void __cdecl QAbstractSocket::setReadBufferSize(__int64)" ([email protected]@@[email protected])
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual bool __cdecl QAbstractSocket::setSocketDescriptor(__int64,enum QAbstractSocket::SocketState,class QFlags<enum QIODevice::OpenModeFlag>)" ([email protected]@@[email protected]@[email protected]@[email protected]@@@@Z)
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual void __cdecl QAbstractSocket::setSocketOption(enum QAbstractSocket::SocketOption,class QVariant const &)" ([email protected]@@[email protected]@[email protected]@@Z)
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual __int64 __cdecl QAbstractSocket::socketDescriptor(void)const " ([email protected]@@UEBA_JXZ)
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual class QVariant __cdecl QAbstractSocket::socketOption(enum QAbstractSocket::SocketOption)" ([email protected]@@[email protected]@[email protected]@@Z)
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual bool __cdecl QAbstractSocket::waitForBytesWritten(int)" ([email protected]@@[email protected])
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual bool __cdecl QAbstractSocket::waitForConnected(int)" ([email protected]@@[email protected])
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual bool __cdecl QAbstractSocket::waitForDisconnected(int)" ([email protected]@@[email protected])
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "public: virtual bool __cdecl QAbstractSocket::waitForReadyRead(int)" ([email protected]@@[email protected])
1>SimNodeSendThread.obj : error LNK2001: 无法解析的外部符号 "protected: virtual __int64 __cdecl QAbstractSocket::writeData(char const *,__int64)" ([email protected]@@[email protected])
看了网上的各种方法,因为本来用VS+QT的就不多,stackoverflow上有一些建议,比如包含QNetwork lib啦,清理解决方案啦,没用,觉得自己辛辛苦苦写的两千行代码没救了,准备改成Windows API重新写一遍,最后一次尝试的时候打开了项目属性,突然发现每次新建Qt项目的时候都会默认选择GUI,Widget这些,但是似乎没有Network。
于是勾选Network,F7编译,问题解决。
一个特别小的问题,导致我浪费了两个小时来找原因。用VS写Qt的同学们不多,没准以后哪天用到Qt封装的Socket会碰到这个问题,而且网上各种中英文资料都找不到原因,希望这篇文章能帮助大家避坑。