關於 Windows 下 Qt 開發,這個問題必須要搞清楚!


小伙伴們,大家好,小北師兄又來喂飯啦,從上次寫完《一個例子讓你秒懂 Qt Creator 編譯原理》后,師兄對於 Qt 的一些環境配置有了更深的理解,這對師兄進行 Qt 的后續學習起到了很大的促進作用。

文章首發於微信公眾號 小北師兄,里面還有更多精彩內容值得你們擁有!

師兄除了工作時間外就在進行 Qt 的基礎學習,說來也巧,師兄自學過程中一直在使用 Qt Creator 這個開發環境,從沒有想過使用 Visual Studio 這個龐然大物。結果在學習 Qt 插件的時候就間接涉及到了 Visual Studio。下面聽師兄一一道來,里面會涉及到 Windows 下 Qt 開發的一些重點問題

師兄電腦基礎環境:

Win10 + Qt 5.9.9 MinGW/g++

最近師兄在學習創建 Qt 插件相關的知識,也就是《Qt Creator 快速入門》這本書的第 9 章的 9.3 小節,其中這個小節講到了,基於插件架構可以使用自定義部件,也就是說我們可以設計一款 Qt 設計師界面中沒有的部件給其他人用,當然也可以用別人設計好的部件,這確實是一個很方便的功能。

看到這里,師兄就按照書中的步驟定義了一個部件,接下來就是編譯自定義部件以及將生成的動態庫放到了指定目錄中,師兄滿懷欣喜的打開 Qt Creator 新建了一個 Widget Application 項目,心想這回可以看到剛才自定義的部件了,結果,結果,結果。。。就是什么都沒發現,沒有看到自己定義的部件

師兄根據書上的提示以及在幫助文檔中查看 "Adding Qt Designer Plugins" 相關內容才知道是怎么回事。實際上,Windows 平台 Qt Creator 是由 Visual Studio 編譯生成的程序(用的 MSVC 編譯器),而 Qt Creator 編譯程序時默認用的編譯器是 MinGW(安裝 Qt 時自動下載好的),也就是說自定義的插件是 MinGW 編譯成的動態庫。由於兩個編譯器不同,那么 Qt Creator(由 MSVC 編譯器編譯生成的) 無法動態加載插件(由 MinGW 編譯器編譯生成的庫),結果就是打開 Qt Creator 后看不到自定義的插件。

問題找到了,那么如何才能在 Qt Creator 中使用自定義的插件呢?解決方法有兩個:

第一,用 MinGW 編譯一個 Qt Creator 出來(源碼自己編譯),那么 Qt Creator 就可以加載 MinGW 編譯出來的插件了

第二,將當前的 Qt Creator 的編譯器改成 MSVC(下載安裝一個這種編譯器進行配置),注意 MSVC 的版本要與 Qt Creator 的版本一致(注:Qt Creator 這個軟件當時用的 MSVC 的某個版本編譯生成的),然后從新編譯插件程序,這樣新生成的插件就可以被 Qt Creator 加載了

其中最簡單就是方法二,安裝 MSVC 編譯器,首先要確定我們到底要下載安裝哪個版本的 MSVC ,打開 Qt Creator ,點擊幫助-> About Qt Creator,如下圖 1 所示

圖 1 Qt Creator 版本信息

可以發現該版本的 Qt Creator 是由 MSVC 2017 32 位編譯器編譯生成的。因此第一選擇就是下載 MSVC 2017 版本的編譯器;第二選擇就是下載一個兼容的 MSVC 2015 版本(經過上面自定義部件實驗已經驗證過了,這個版本的編譯器也可以)。先說結論,師兄最后下載的是 MSVC 2015。

有必要解釋一下為何選擇 MSVC2015。師兄在安裝 Qt5.9.9 時選擇了很多編譯器組件(與編譯器的版本對應),如圖 2 所示,這里就是師兄安裝的 Qt 的編譯器組件

圖 2 Qt 編譯器組件

從圖 2 中可以看到,Qt5.9.9 支持的編譯器不太多,這個要追溯到師兄安裝 Qt5.9.9 組件選擇界面來,如下圖 3 紅色框所示,這是師兄安裝 Qt5.9.9 時選擇的組件界面,已經把該版 Qt 支持的所有 MSVC 編譯器組件下載下來了。

圖 3 安裝向導的編譯器組件

發現沒,這里的組件確實沒有 MSVC 2017 32 位的,只有 64 位的,如果使用 MSVC2017 64 位的編譯器編譯插件代碼,那么 Qt Creator 是無法鏈接 64 位的庫的,那么只能放棄下載 MSVC 2017 了。

可以看到 MSVC 2015 32 位是有的,那么就決定下載 MSVC 2015,查到網上有些資料,建議直接下載個 VS2015,然后就會自帶 MSVC 2015 版本了,這種對於師兄的電腦來說不太友好,因為師兄的筆記本電腦已經有了 VS2019 了,如果在下載一個 VS2015 那么電腦的空間吃不消,因此又在網上查了一下,有人說,可以到 VS 官網直接下載 VS 2015 的工具,該下載界面如下圖 4 所示

圖 4 VS2015 編譯工具

可以看到這兩個工具的說明,第一個英文名叫做 Microsoft build tools, 是一個 Windows 平台下的編譯工具,包含了 MSVC(Microsoft Visual C++),第二個是 Windows 平台的基礎庫,是 C++ 應用程序運行的基礎組件。師兄僅僅下載安裝了第一個 Microsoft 生成工具,因為師兄之前安裝 vs2019 時,已經默認安裝了第二個。

此時 MSVC 2015 安裝完畢,那么打開 Qt Creator 配置一下編譯器,下圖 5 所示為配置好的界面

圖 5 Qt Creator 編譯器配置

這個時候還要測試一下編譯器是否真的配置成功,師兄打開了一個原來的工程,從新用 MSVC2015 編譯,測試一下。很遺憾,編譯出現了圖 6 所示的編譯問題,這說明師兄配置還是有點問題,不過不要慌,先看看編譯的錯誤信息

圖 6 MSVC 2015 編譯結果

看一下框住的那句錯誤提示,可以發現,Qt Creator 內置編譯器在鏈接階段無法找到 rc.exe 這個程序,導致鏈接失敗。師兄又在網上找了一下這個問題的解決方案,有的說在 VS 安裝目錄找到 rc.exe 以及 rcdll.dll 拷貝到 Qt 安裝目錄的某個目錄下,比如我這里的 D:\Qt\Qt5.9.9\5.9.9\msvc2015\binC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin 目錄下

這種方法師兄沒有嘗試過,覺得不是最好的辦法,而且還有一定的局限性。

不知道你們有沒有發現一個問題,比如師兄利用 Everything 搜索了一下 rc.exe ,會發現有好幾個目錄中都有這個文件,如圖 7 所示,如果就用拷貝的方法,到底拷貝哪一個呢?這個問題也引發了一些其他問題,師兄繼續往下說,后面會有答案

圖 7 rc.exe 搜索結果

從圖 7 中可以發現 rc.exe 主要存在目錄是 C:\Program Files (x86)\Windows Kits,這個文件夾又包含了兩個文件夾,如圖 8 所示

圖 8 Windows Kits 包含目錄

從圖中紫色框修改日期中可以發現,這兩個目錄時間與師兄安裝 VS2019 以及圖四 VS2015 生成工具的時間是一一對應的。至少可以說明 Windows Kits 這個文件夾是由 VS2019 安裝程序創建的,存放一些工具包供給開發者使用。

既然這兩個目錄中都含有 rc.exe 這個程序,那么哪個才是我們需要的程序呢?

答案是,需要查看當前 Qt Creator 構建套件所使用的 Windows Kits 版本信息

打開 Qt Creator ,配置 MSVC2015 32 位構建套件,然后查看使用的系統環境變量,需要找到 Window kits 類似的環境變量,如下圖 9 所示


圖 9 MSVC 環境變量

從圖中的黃色畫線部分就可以發現,直接指向 Windows Kits\10 這個目錄,因為師兄使用的是 32 位的 MSVC2015,因此根據圖 7 的搜索結果很快就能找到 rc.exe,既然已經找到了 rc.exe ,那么就可以按照網上的做法將 rc.exe 以及 rcdll.dll 拷貝到對應的目錄。

師兄沒有立刻進行拷貝,師兄覺得不能因為提示說找不到 rc.exe 就簡單拷貝這個,如果拷貝完了還缺少其他東西呢,拷貝總不是一個很好的解決方案,師兄再次查看了一下圖 6 編譯時的輸出信息,發現了編譯的流程,它開始用 cl.exe 進行單元編譯,然后調用 link.exe 進行鏈接,然后就輸出了這條錯誤信息 LINK : fatal error LNK1158: cannot run 'rc.exe',這里可以推斷出,應該是 link.exe 程序內部調用了 rc.exe 這個程序,結果 link.exe 程序始終找不到 rc.exe 這個程序。這里大家是不是很熟悉,師兄在上一篇《一個例子讓你秒懂 Qt Creator 編譯原理》中就遇到有類似的場景,而且特意觀察了一下 Makefile.Debug 文件的內容,這些對於解決問題都是很有幫助的。

那么最正統的解決方案是修改系統的環境變量,只要將確定好的 rc.exe 所在的目錄添加到系統的 PATH 環境變量中即可(這點與 Linux 差不多),如圖 10 所示即為師兄電腦的環境變量,這也是師兄覺得最好的解決方法。之后從新打開 Qt Creator 以及之前的測試工程,發現編譯運行成功。


圖 10 添加后的系統環境變量

到這里,其實 MSVC 2015 這個編譯才算是配置成功,緊接着師兄從新編譯文章最開始說的自定義組件程序,這回終於可以在 Qt Creator 的集成 Qt designer 界面中看到自定義的部件了,大功告成,

實際上,師兄在解決上述問題的時候也查閱了很多資料,覺得 Windows C 盤目錄是一個盲區,因此特意查看了一下 Windows 系統 C 盤目錄的含義,重點關注了 VS2019 安裝后會生成哪些相關的重點目錄, 師兄一直在找 VS2019 安裝的 log 文件(類似 Linux 系統安裝軟件包時會自動記錄安裝的位置信息以及安裝內容),但是很遺憾,沒有找到這樣的文件,導致師兄無法真的知道 VS2019 到底新建立了哪些目錄,只能根據自己安裝 VS2019 的時間進行推測。

因為 C 盤的 Program Files(x86) 是應用程序安裝目錄,因此師兄主要把這個目錄與 Visual Studio 以及有關 C++ 應用開發的相關文件夾列出來(不一定全,這幾個文件夾對於日常開發來說是有用的)

安裝圖 4 Microsoft Build Tool 2015 后單獨擁有的目錄:

Microsoft Visual C++ Build ToolsMicrosoft Visual Studio 14.0

安裝 VS2019 獨有的目錄:

Microsoft SDKsMicrosoft Visual Studio

安裝圖 4 Microsoft Build Tool 2015 以及 VS2019 后都會有的目錄:

MSBuildWindows Kits

喜歡的小伙伴請動動你們可愛的小手,多多點贊!你們的支持為我不斷寫出干活文章提供源源不斷的動力!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM