首页 > 编程语言 >利用xmake在c++项目中编译与调用webassmebly

利用xmake在c++项目中编译与调用webassmebly

时间:2022-11-20 21:01:40浏览次数:42  
标签:webassembly xmake target 编译 c++ webassmebly add set

最近在尝试用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,可能是我的编译目标没设置对。

标签:webassembly,xmake,target,编译,c++,webassmebly,add,set
From: https://www.cnblogs.com/vkensou/p/16909513.html

相关文章

  • linux 多线程 c++2
    为了在用线程分离的时候保证即使主线程退出了,子线程还能正常运行,可以使用pthread_exit(NULL)去退出主线程,这样地址空间还能正常存在线程分离是为了保证主线程不会被堵塞,还能......
  • C++ Tips:signed main 和 int main 的区别?
    #include<bits/stdc++.h>#defineintlonglongusingnamespacestd;signedmain(){return0;}注意到#defineintlonglong而main函数必须返回一个in......
  • c++:模板
    一、模板的基本概念c++除了面向对象的编程思想之外,还有泛型编程,主要技术是模板。c++提供两种模板机制:函数模板,类模板。函数模板:建立一个通用函数,其函数返回值和形参类型......
  • C++面向对象程序设计概念梳理
    写在前面:本篇文档是为了《C++面向对象程序设计》课程所写,包含了本课程考试可能会考的所有概念。当然,因为目的只是为了通过考试,所以我将这些概念已经尽量精简。如果你将下......
  • c++:函数的重载
    一、重载的定义对于同一种功能但是参数不一样的函数,使用重载就可以实现功能相同的函数拥有相同的函数名,在调用函数的时候,通过实参的类型,判断调用哪个函数。【不使用重载......
  • c/c++常见的数据类型表示的范围
    首先参考博客 ​​C语言:基本数据类型及表示范围-myrj-这里有个疑问,int和long到底什么区别:看了一些博客:​​在C+中,int和long有什么区别?​​​​C和C++中int和long有什么......
  • Android 编译C++
    Android编译C++项目​​前言​​​​正文​​​​一、基本知识​​​​①要做什么?​​​​②JNI是什么?​​​​③NDK是什么?​​​​二、配置NDK​​​​三、创建新工程......
  • [排序算法] 归并排序 (C++)
    归并排序解释归并排序MergeSort是典型的分治法的应用,其算法步骤完全遵循分治模式。分治法思想分治法思想:将原问题分解为几个规模较小但又保持原问题性质的子问题,......
  • windows--cmake与c++的使用教程(13)
    1概述本文基于前文环境本节目标:为发布项目关闭调试控制台(/SUBSYSTEM:WINDOWS)2CMake脚本设置debug显示控制台还是很有帮助的,可输出调试信息到控制台,观察成勋运......
  • windows--cmake与c++的使用教程(12)
    1概述本文基于前文环境本节目标:为项目增加链接选项:requireAdministrator(/level='requireAdministrator'),用于增加管理员权限2目标程序安装C盘(windows默认系......