Mozilla在今年三月份的時候公佈了WASI。WASI的目標就是讓WebAssembly在任何地方都可以運行,而不僅僅像現在這樣只能運行在Node.js和Web瀏覽器中。WASI目前依然處於初級階段,這篇文章分享下如何把ZXing C++通過WASI Libc編譯成wasm文件。
支持WASI運行時的工具
現在可以用wasmer和wasmtime通過命令行來運行支持wasi的wasm文件。wasmer提供了安裝包,而wasmtime只能通過源碼來編譯。兩個工具都支持windows, Linux和macOS。
編譯ZXing C++
下載最新的WASI-SDK。這個安裝包中已經自帶了clang,所以不需要單獨安裝clang。
設置環境變量:
sudo dpkg -i wasi-sdk_7.0_amd64.deb
export PATH=/opt/wasi-sdk/bin:$PATH
export CC=/opt/wasi-sdk/bin/clang
export CXX=/opt/wasi-sdk/bin/clang++
從GitHub上下載一份ZXing C++的源碼。
接下來要對工程結構做一些修改。首先在example中的CMakeLists.txt文件裏設置sysroot:
set (CMAKE_SYSROOT /opt/wasi-sdk/share/wasi-sysroot)
因爲目前的wasi-libc不支持C++的異常處理,所以要加上-fno-exceptions:
set (CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} — target=wasm32-wasi -Wall -Wextra -fno-exceptions”)
要編譯的文件包含了scan_image.cpp以及ZXing相關的源碼文件。把他們整合在一起。然後去掉所有源碼中的異常處理代碼。
編譯工程:
mkdir build
cd build
cmake ..
cmake --build .
接下來就可以運行wasm文件了:
$ wasmer run zxing_barcode_reader.wasm — dir=$(pwd)/../ $(pwd)/../test.png
Text: MEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;
Format: QR_CODE
Position: 190x367 205x162 422x165 405x342
EC Level: M
$ wasmtime zxing_barcode_reader.wasm — dir=$(pwd)/../ $(pwd)/../test.png
Text: MEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;
Format: QR_CODE
Position: 190x367 205x162 422x165 405x342
EC Level: M
通過wapm發佈之後也可以用wapm來運行:
源碼
https://github.com/yushulx/wasi-zxing-wasm