Win10+Qt5 编译 qextserialport总结

2 篇文章 0 订阅

虽然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*有问题吗?就为了这个问题在网上搜了半天。。。最后实在没办法了,直接改代码:

  • 在buff前直接强制(char*)
  • 把toAscii 改成toLatin1

这下更懵逼了:


 

    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<struct QextPortInfo> &)" (?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<struct QextPortInfo> &)" (?setupAPIScan@QextSerialEnumerator@@CAXAEAV?$QList@UQextPortInfo@@@@@Z) 中被引用
qextserialenumerator.obj : error LNK2019: 无法解析的外部符号 __imp_SetupDiGetDeviceInterfaceDetailA,该符号在函数 "private: static void __cdecl QextSerialEnumerator::setupAPIScan(class QList<struct QextPortInfo> &)" (?setupAPIScan@QextSerialEnumerator@@CAXAEAV?$QList@UQextPortInfo@@@@@Z) 中被引用
qextserialenumerator.obj : error LNK2019: 无法解析的外部符号 __imp_SetupDiGetClassDevsA,该符号在函数 "private: static void __cdecl QextSerialEnumerator::setupAPIScan(class QList<struct QextPortInfo> &)" (?setupAPIScan@QextSerialEnumerator@@CAXAEAV?$QList@UQextPortInfo@@@@@Z) 中被引用
qextserialenumerator.obj : error LNK2019: 无法解析的外部符号 __imp_SetupDiOpenDevRegKey,该符号在函数 "private: static void __cdecl QextSerialEnumerator::setupAPIScan(class QList<struct QextPortInfo> &)" (?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<struct QextPortInfo> &)" (?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

想屎的心都有了

 

  • 14
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: win10+vs2017+qt+opencv 是一种常用的开发环境组合,可以用于开发图像处理、计算机视觉等应用程序。其中,win10 是操作系统,vs2017 是集成开发环境,qt 是跨平台应用程序开发框架,opencv 是计算机视觉库。这种组合可以提高开发效率,简化开发流程,同时也具有良好的兼容性和稳定性。 ### 回答2: Win10 vs2017 Qt OpenCV,其实是三个不同的对象,下面将它们逐一进行分析。 Win10,顾名思义,就是Windows 10操作系统的缩写。Windows是全球最为知名的操作系统之一,其在操作界面、软件支持、硬件厂商等方面具有较为广泛的应用和覆盖。Win10更是在基础操作系统的基础上,对界面、安全性、易用性、兼容性等方面进行了优化和改善,使其成为一个更为齐全且更易于使用的操作系统,目前得到了广泛的用户认可。 Vs2017,是Visual Studio的缩写,2017表示该版本发布的年份。Vs是由美国微软公司开发的一款用于软件开发的集成开发环境。Vs不仅包含了代码编写、调试、编译等方面的工具,还提供了一系列辅助开发技术,例如代码重构、版本管理、跨平台开发等等。Vs被广泛应用于Windows平台下的开发,除此之外也支持其他操作系统、开发语言以及开发模式等等,其本身也在持续地更新升级以适应日益变化的开发环境。 Qt,是一个跨平台的C++应用程序开发框架,也被称为“跨平台图形用户界面应用程序开发框架”。Qt是由挪威Trolltech公司于1991年开始开发的,旨在为开发人员提供高效的框架,并能够快速构建新的应用程序。Qt具有良好的可扩展性并提供丰富的开发API,使得其可以被用于开发桌面应用、移动应用、嵌入式应用等等。在跨平台方面,Qt提供了大量的平台支持,例如Windows、Linux、macOS、Android、iOS等等,极大地方便了开发人员的工作。 OpenCV,全称是“开源计算机视觉库”,是一套基于BSD许可协议的跨平台计算机视觉应用程序开发库,可用于开发实时的计算机视觉应用程序。该库广泛应用于学术研究、科研领域以及商业领域,其支持的领域也很广泛,例如目标检测、图像处理、运动跟踪、机器学习等等。OpenCV支持众多编程语言,例如C++、Python、Java等等,也可以被用于多种操作系统上,例如Windows、Linux、macOS等等。 从以上几个对象的简介来看,Win10、Vs2017、Qt、OpenCV分别是一款操作系统、一个开发工具、一个应用框架和一个开发库。它们是在不同的层面上为开发者和用户提供更好的工具和服务,目的是为了更好地完成软件开发的工作。不过在这些工具之间使用并不是互相排斥的,有时候我们也需要使用它们的组合,以便于完成某些特定的开发任务。 ### 回答3: Win10 VS2017 QT OpenCV是现今非常热门的开发环境,被广泛用于开发图形图像领域。 Win10是目前Microsoft推出的最新的操作系统,与之前的操作系统相比,更加注重用户体验,同时也更注重安全性和稳定性。Win10的更新速度很快,对开发环境与软件的兼容性比之前的版本都要更好。 VS2017是Microsoft推出的最新的开发IDE,它更加注重与异构工具链、云开发的集成,提高了团队合作的效率,同时提供了许多新的代码分析和调试工具,能够更准确地定位出现的错误。此外,VS2017也提供了用于跨平台开发的工具,非常适用于在Win10系统上进行开发。 QT是一个跨平台的C++开发框架, 其提供了丰富的GUI类库和工具。QT的特点是:跨平台,简单易用,一致性强,可定制化程度高。QT是一款免费的开源软件,因此十分受欢迎。在Win10系统上使用QT进行开发,可以帮助开发者快速地编写GUI应用程序。 OpenCV是一款流行的计算机视觉库,它提供了许多图像和视频处理的函数和算法。OpenCV可用于各大平台的开发,操作方便而深受开发者的青睐。OpenCV适用于Win10系统上,可以在QT环境中使用,为开发者提供优雅高效的图像处理解决方案。 综上所述,在Win10系统中,使用VS2017作为开发IDE,配合QT进行GUI界面的实现与OpenCV进行计算机视觉处理,能够快速地搭建起强大的开发环境。Win10 VS2017 QT OpenCV的组合能够提高开发者的效率与开发程序的稳定性,并应用于图形图像领域的快速开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值