接上回,聊聊函子 functor。 functor 是一個容器。該容器的 value 屬性指向被包裹的數據;該容器的 map 方法對容器進行映射變換。 以下代碼實現一個最普通的 functor,稱之為 Just, 根據 map 的傳參 fn 對 value 進行變換: class Just<T> { ...
最近在嘗試用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,可能是我的編譯目標沒設置對。