需求
我正在配置 Qt wasm環境, 但是 emsdk 不支持 apple m1 issue 769
上一篇博文 我配置好 wasm 後發現 還是無法配合 qt 使用.
環境:
MacOS Bigsur M1, Qt 5.15.2
單單配置好wasm, 當前的配置還是不能工作, 比如說, 我現在用 clang 編譯一個 Qt 的 Example:

可以看到, 項目本身沒問題, 能跑起來;
我接著用剛剛配置的 em++ 編譯一遍:

分析上面的報錯, 有一大堆 permission denied
或者 file not found
. 結合 Docker 容器的特性, 我們就知道錯誤的根源了. 上面的配置, emcc 的路徑只和當前的路徑對應, 而在 qt 編譯過程中會引用很多不在當前目錄下的文件, 容器找不到, 就只能報錯.
那麼怎麼解決呢? 我們當然可以手動給他映射上去, 但是每一次都這麼幹, 碰到複雜的項目煩也要煩死. 而且如果像第一種沒有 WebAssembly Kit 的情況, qt 自己也不支持, 那麼要做的東西要海了去了. 所以說, 總是要有其他方法的.
這個方法還是 Docker.
解決方案
Qt 官網文檔: using-docker-test-qt-webassembly
maukalinow/qtwasm_builder
: Docker Hub
以上文檔的意思是叫我們自己 Build 一個 Docker 鏡像. 但是顯然已經有人做過了, 本著不要重複發明輪子的定律, 我們可以直接將網友做好的鏡像 Pull 過來: (自行根據 Qt 版本選擇)
docker pull maukalinow/qtwasm_builder:5.15_latest
接著, 我們編譯一下剛才的項目測試一下:
docker run --rm -v ~/Desktop/anaclock/bin:/project/build -v ~/Desktop/anaclock:/project/source maukalinow/qtwasm_builder:5.15_latest
cd /Users/justin/Desktop/anaclock/bin python3 -m http.server
接下來打開 這個地址: http://localhost:8000/analogclock.html
可以看到, 我們的 qt 應用已經在瀏覽器上面原生運行了.

為 Qt 安裝 emsdk 到現在為止已經成功.
優化
加快項目生成速度

觀察以上編譯記錄我們可以發現, 絕大部分的時間都浪費在 generating system library
上了, 而這些庫無疑都是可以復用的. 所以接下來的事情, 就比較簡單了. 在命令後面加一條, 把緩存文件夾映射到宿主機上, 不就成了嗎?
docker run --rm -v ~/Desktop/anaclock/bin:/project/build -v ~/Desktop/anaclock:/project/source -v ~/.emsdk_cache:/root/dev/emsdk/upstream/emscripten/cache maukalinow/qtwasm_builder:5.15_latest
連著運行這個命令兩遍, 可以看出, 第二遍明顯就比第一遍快了 N 多倍.

簡化輸入命令
正如之前提到, 這麼長的命令並不利於記憶, 我們可以寫一個腳本讓他變短很多.
所以我就寫了一個腳本, 你可以在下面的鏈接下載到.
之後只要在目錄下輸入 qtwasm
, 構建就自動完成了