ToB企服应用市场:ToB评测及商务社交产业平台

标题: 利用xmake在c++项目中编译与调用webassmebly [打印本页]

作者: 干翻全岛蛙蛙    时间: 2022-11-20 22:11
标题: 利用xmake在c++项目中编译与调用webassmebly
最近在尝试用webassembly替代lua作为c++程序的脚本。刚好xmake也支持了webassembly的编译。下面是踩坑记录。
项目需要两个target:一个c++项目、一个webassembly项目。需要自动编译webassembly,并且c++项目依赖webassembly的编译结果。下面是我的测试项目的xmake配置:
  1. add_requires("conan::wasmer/2.3.0", {alias="wasmer",configs={vs_runtime="MT"}})
  2. target("scripts")
  3.     set_plat("wasm")
  4.     set_toolchains("emcc")
  5.     set_kind("binary")
  6.     add_files("scripts/*.cpp")
  7.     add_cleanfiles("scriptsout/*.*")
  8.     add_cxflags("-O3")
  9.     add_ldflags("-sERROR_ON_UNDEFINED_SYMBOLS=0")
  10.     after_build(function(target)
  11.         local dir = target:targetdir()
  12.         local filename = target:basename() .. ".wasm"
  13.         local filepath = path.join(dir, filename)
  14.         local outdir = "scriptsout"
  15.         os.mkdir(outdir)
  16.         os.cp(filepath, outdir)
  17.     end)
  18. target("wasmertest")
  19.     add_cxflags("/MT")
  20.     set_languages("cxx20")
  21.     add_rules("mode.debug", "mode.release")
  22.     add_links("advapi32")
  23.     set_kind("binary")
  24.     add_files("src/*.cpp")
  25.     add_deps("scripts")
  26.     add_packages("wasmer")
  27.     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,可能是我的编译目标没设置对。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4