最近在嘗試用webassembly替代lua作為c++程式的腳本,剛好xmake也支持了webassembly的編譯,下面是踩坑記錄,
專案需要兩個target:一個c++專案、一個webassembly專案,需要自動編譯webassembly,并且c++專案依賴webassembly的編譯結果,下面是我的測驗專案的xmake配置:
add_requires("conan::wasmer/2.3.0", {alias="wasmer",configs={vs_runtime="MT"}}) target("scripts") set_plat("wasm") set_toolchains("emcc") set_kind("binary") add_files("scripts/*.cpp") add_cleanfiles("scriptsout/*.*") add_cxflags("-O3") add_ldflags("-sERROR_ON_UNDEFINED_SYMBOLS=0") after_build(function(target) local dir = target:targetdir() local filename = target:basename() .. ".wasm" local filepath = path.join(dir, filename) local outdir = "scriptsout" os.mkdir(outdir) os.cp(filepath, outdir) end) target("wasmertest") add_cxflags("/MT") set_languages("cxx20") add_rules("mode.debug", "mode.release") add_links("advapi32") set_kind("binary") add_files("src/*.cpp") add_deps("scripts") add_packages("wasmer") set_rundir("$(projectdir)")
webassembly的實作我選用了wasmer,第一個target是webassembly專案,我選用了emscripten作為編譯工具,實作了after_build事件,用于在編譯完成后將wasm檔案拷貝到專案目錄下的scriptsout目錄,并且也設定了cleanfiles,這樣清理專案的時候可以自動清理scriptsout目錄,“ERROR_ON_UNDEFINED_SYMBOLS”是emscripten的編譯選項,用于通知編譯器發現使用了外部匯入的函式不要報錯,第二個target是c++專案,就正常設定即可,這里設定了依賴scripts,最后設定運行目錄為專案目錄,這樣每次運行的時候可以方便的參考到scriptsout目錄,
后記:本來想使用wamr的,但官方沒有提供conan包,所以只好使用wasmer了,我盡量使用wasm-c-api,這樣后面切換起來也方便,還有xmake官方說支持wasi不過我還沒嘗試成功,看原始碼wasi呼叫的是clang,可能是我的編譯目標沒設定對,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/536842.html
標籤:其他
上一篇:Java 函式式編程「二」
下一篇:Java學習一
