如何通過WASI SDK 在Linux上編譯ZXing C++

Mozilla在今年三月份的時候公佈了WASI。WASI的目標就是讓WebAssembly在任何地方都可以運行,而不僅僅像現在這樣只能運行在Node.js和Web瀏覽器中。WASI目前依然處於初級階段,這篇文章分享下如何把ZXing C++通過WASI Libc編譯成wasm文件。

支持WASI運行時的工具

現在可以用wasmerwasmtime通過命令行來運行支持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

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