Win10+Qt5 編譯 qextserialport總結

雖然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

想屎的心都有了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章