Heresy 這邊在 Docker 裡面使用 Visual Studio 來建立 Windows 版的 Qt 已經好一陣子了,有興趣的可以參考之前的《使用 Visual Studio 建置 Qt 6》。
而之前 Qt 6.x 的幾個版本改變都沒有太大的問題、可以直接建置出來;不過最近在要建置 Qt 6.5.0(官方介紹、下載)的時候,卻碰到問題而沒辦法完成建置…這邊就稍微來記錄一下。
問題
首先,這邊的問題是在建置的過程中,當建置到 Qt Quick 的 QtDeclarative 的這個模組的時候,會出現錯誤,其錯誤內容大概如下:
[2688/10902] Generating .qsb/scenegraph/shaders_ng/24bittextmask.frag.qsb FAILED: qtdeclarative/src/quick/.qsb/scenegraph/shaders_ng/24bittextmask.frag.qsb C:/build/qtdeclarative/src/quick/.qsb/scenegraph/shaders_ng/24bittextmask.frag.qsb cmd.exe /C "cd /D C:\build\qtdeclarative\src\quick && C:\build\qtbase\bin\qsb.exe --glsl 100es,120,150 --hlsl 50 --msl 12 -b -c -O -s -o C:/build/qtdeclarative/src/quick/.qsb/scenegraph/shaders_ng/24bittextmask.frag.qsb C:/TEMP/QtSource/qtdeclarative/src/quick/scenegraph/shaders_ng/24bittextmask.frag"
查了一下,基本上應該就是當他要使用內部建置出來的「qsb」這個工具程式(參考)來產生 shader 檔案的時候出現錯誤、沒辦法產生出需要的檔案的關係。
而經過測試,在建置目錄下的「qtbase\bin\qsb.exe
」這個工具程式確實被建置出來,但是雖然在真實的 Windows 環境下可以正常運作,但是在 Docker 環境內卻沒辦法正確執行,連基本的「qsb -v
」都沒辦法得到版本資訊。
解決方法
當釐清是 qsb 沒辦法在 Docker 中正常執行後,Heresy 第一個聯想就是有缺 dll。
但是如果用「dumpbin /dependents qbs.exe
」(參考)去檢查他需要的 DLL 的時候,卻又看不出明顯的問題?列出來的 DLL 也都確實存在。
不過,由於 qsb 是在進行 shader 的產生用的,所以 Heresy 會覺得應該和 3D Graphics API 有關?或許是會在運作的過程中才另外去呼叫。
後來則是改用 Dependency Walker 這個工具程式(網站)去開啟 qsb.exe,這才確定他會去讀取 Direct 3D 等 DLL。
而經過了簡單的試誤法(try and error)後,則是發現他缺少了「dcomp.dll
」這個檔案(DirectComposition、參考,嚴格來說也不是 Direct 3D 的東西),所以只要從實體機器裡面把這個檔案複製到 Docker 內、讓 qsb 在執行的時候找的到就可以了;而最簡單的方法,就是把 dcomp.dll 這個檔案放到 Docker 容器的 c:\windows\system32
裡就可以了。
現階段是這樣可以成功建置出 Qt SDK,但是老實說,這邊沒有在用 Qt Quick 的功能,所以這邊的元件到底有沒有正常運作呢?有碰到問題再說吧。