虽然Qt5官方添加了QSerialPort类,但据说这个类却不支持通过超时来分包,这对嵌入式用户而言有啥用?不得已还得用Qextserialport。
网上好多文章都把使用这个东东说得跟鼻子上的饭似的,一步,两步,三步,搞定!我却要来讲讲使用qextserialport的苦逼过程:
下载源码后,看到有个Example文件夹,Great!直接用QtCreator打开里面的Enumerator例程,编译:
:-1: error: LNK1104: 无法打开文件“qextserialportd.lib”
What the hell???懵逼了,咋自带的Example都不能正确编译呢?我了个去了!再一看代码目录结构,只有一个main.cpp源文件:
搜索了一下源代码路径,没有什么lib文件啊?算了,直接把源文件加上, 把包含库的pro代码注释掉,变成这样:
D:\Workspace\Qt\qextserialport-1.2win-alpha\qextserialenumerator.cpp:40: error: C2665: “QString::fromLocal8Bit”: 2 个重载中没有一个可以转换所有参数类型
C:\Qt\5.11.2\msvc2017_64\include\QtCore\qstring.h:571: 可能是“QString QString::fromLocal8Bit(const char *,int)”
D:\Workspace\Qt\qextserialport-1.2win-alpha\qextserialenumerator.cpp:40: 尝试匹配参数列表“(BYTE *, DWORD)”时
D:\Workspace\Qt\qextserialport-1.2win-alpha\qextserialenumerator.cpp:57: error: C2665: “QString::fromLocal8Bit”: 2 个重载中没有一个可以转换所有参数类型
甚至还有一个:
D:\Workspace\Qt\qextserialport-1.2win-alpha\win_qextserialport.cpp:187: error: C2039: “toAscii”: 不是“QString”的成员
。。。。。
其中的BYTE是个typedef,其原型是unsigned char, 这个自动转换成char*有问题吗?就为了这个问题在网上搜了半天。。。最后实在没办法了,直接改代码:
这下更懵逼了:
C:\Qt\Tools\QtCreator\bin\jom.exe -f Makefile.Debug
link /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:CONSOLE "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /MANIFEST:embed /OUT:debug\enumerator.exe @C:\Users\Seven\AppData\Local\Temp\enumerator.exe.203980.16.jom
obj\main.obj : warning LNK4042: 对象被多次指定;已忽略多余的指定
qextserialenumerator.obj : error LNK2019: 无法解析的外部符号 __imp_RegCloseKey,该符号在函数 "private: static void __cdecl QextSerialEnumerator::setupAPIScan(class QList &)" (?setupAPIScan@QextSerialEnumerator@@CAXAEAV?$QList@UQextPortInfo@@@@@Z) 中被引用
qextserialenumerator.obj : error LNK2019: 无法解析的外部符号 __imp_RegQueryValueExA,该符号在函数 "private: static class QString __cdecl QextSerialEnumerator::getRegKeyValue(struct HKEY__ *,char const *)" (?getRegKeyValue@QextSerialEnumerator@@CA?AVQString@@PEAUHKEY__@@PEBD@Z) 中被引用
qextserialenumerator.obj : error LNK2019: 无法解析的外部符号 __imp_SetupDiEnumDeviceInterfaces,该符号在函数 "private: static void __cdecl QextSerialEnumerator::setupAPIScan(class QList &)" (?setupAPIScan@QextSerialEnumerator@@CAXAEAV?$QList@UQextPortInfo@@@@@Z) 中被引用
qextserialenumerator.obj : error LNK2019: 无法解析的外部符号 __imp_SetupDiGetDeviceInterfaceDetailA,该符号在函数 "private: static void __cdecl QextSerialEnumerator::setupAPIScan(class QList &)" (?setupAPIScan@QextSerialEnumerator@@CAXAEAV?$QList@UQextPortInfo@@@@@Z) 中被引用
qextserialenumerator.obj : error LNK2019: 无法解析的外部符号 __imp_SetupDiGetClassDevsA,该符号在函数 "private: static void __cdecl QextSerialEnumerator::setupAPIScan(class QList &)" (?setupAPIScan@QextSerialEnumerator@@CAXAEAV?$QList@UQextPortInfo@@@@@Z) 中被引用
qextserialenumerator.obj : error LNK2019: 无法解析的外部符号 __imp_SetupDiOpenDevRegKey,该符号在函数 "private: static void __cdecl QextSerialEnumerator::setupAPIScan(class QList &)" (?setupAPIScan@QextSerialEnumerator@@CAXAEAV?$QList@UQextPortInfo@@@@@Z) 中被引用
qextserialenumerator.obj : error LNK2019: 无法解析的外部符号 __imp_SetupDiGetDeviceRegistryPropertyA,该符号在函数 "private: static class QString __cdecl QextSerialEnumerator::getDeviceProperty(void *,struct _SP_DEVINFO_DATA *,unsigned long)" (?getDeviceProperty@QextSerialEnumerator@@CA?AVQString@@PEAXPEAU_SP_DEVINFO_DATA@@K@Z) 中被引用
debug\enumerator.exe : fatal error LNK1120: 7 个无法解析的外部命令
jom: D:\Workspace\Qt\qextserialport-1.2win-alpha\examples\build-enumerator-Desktop_Qt_5_11_2_MSVC2017_64bit-Debug\Makefile.Debug [debug\enumerator.exe] Error 1120
jom: D:\Workspace\Qt\qextserialport-1.2win-alpha\examples\build-enumerator-Desktop_Qt_5_11_2_MSVC2017_64bit-Debug\Makefile [debug] Error 2
11:33:41: 进程"C:\Qt\Tools\QtCreator\bin\jom.exe"退出,退出代码 2 。
Error while building/deploying project enumerator (kit: Desktop Qt 5.11.2 MSVC2017 64bit)
When executing step "Make"
11:33:41: Elapsed time: 00:01.
=================这里有昏哥线是因为我觉得这么多引用未定义是有其它的库没加进来,于是我决定还是回去编译qextserialport的库================================================
哪里想到,编译这个裤也有同样的问题。。。。
link /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /DLL /SUBSYSTEM:WINDOWS /MANIFEST:embed /OUT:build\qextserialportd.dll @C:\Users\Seven\AppData\Local\Temp\qextserialportd.dll.206348.2391.jom
qextserialenumerator.obj : error LNK2019: 无法解析的外部符号 __imp_RegCloseKey,该符号在函数 "private: static void __cdecl QextSerialEnumerator::setupAPIScan(class QList &)" (?setupAPIScan@QextSerialEnumerator@@CAXAEAV?$QList@UQextPortInfo@@@@@Z) 中被引用
qextserialenumerator.obj : error LNK2019: 无法解析的外部符号 __imp_RegQueryValueExW,该符号在函数 "private: static class QString __cdecl QextSerialEnumerator::getRegKeyValue(struct HKEY__ *,wchar_t const *)" (?getRegKeyValue@QextSerialEnumerator@@CA?AVQString@@PEAUHKEY__@@PEB_W@Z) 中被引用
build\qextserialportd.dll : fatal error LNK1120: 2 个无法解析的外部命令
搜‘__imp_RegCloseKey’,说是要添加 AdvAPI32.lib,先是在pro文件里加 ‘LIBS += -lAdvAPI32',然后去系统目录里找 ’Advapi32.lib',结果输成了‘Advapi32.dll’,居然也编译过了。。。也过了。。。过了。。。了。。。。Whatever,后来发现其实只要改了pro文件就可了。
蓝俄,我瞎了的狗眼居然没有在编译目录里找到.lib文件,只有dll文件,然后dll文件各种拷贝,各种搜索,各种尝试,此处略过两个小时。。。。最后发现这里有个这么大的坑:
#CONFIG += staticlib
把这个注释还原了,终于编译出了我梦寐以求的lib文件。前辈们,你们为什么要这么考验我们。。。
我以为这下都好了,蓝俄,我还是太天真了,把原来加的源代码都去掉,把pro文件改回去,把lib文件放到各种目录,还是说找不到这个lib,What the f**k!
此处略过两个小时搜索时间。。。
然后在某个很不起眼的地方看到说-l后面要用完整的库的路径,相对或者绝对路径,于是改成这样:
CONFIG(debug, debug|release):LIBS += -l../../qextserialportd
else:LIBS += -l../../qextserialport
编译发现之前的问题还在。。。我执拗地以为是没找到AdvAPI32.lib的原因,于是各种搜索。。。。然后在某个很不起眼的地方看到几个'-lsetupapi',试试再说,居然可以。。。。。。。。。。。
Sigh。。。。。。。。。
更郁闷的是,等我都搞定了,偶然发现之前搜索源代码下载地址的时候打开了一个Github的项目也叫这个名称,试了一下发现一个坑都没有,超级简单,真的跟鼻子上的饭一样。。。。
https://github.com/qextserialport/qextserialport/tree/master
想屎的心都有了