如何编译C++;文件到WebAssembly? 假设我有一个简单的、自包含的C++文件(数学.CPP < /代码>)如下: int add(int x, int y) { return x + y; }

如何编译C++;文件到WebAssembly? 假设我有一个简单的、自包含的C++文件(数学.CPP < /代码>)如下: int add(int x, int y) { return x + y; },c++,webassembly,C++,Webassembly,如何将其编译为WebAssembly(math.wasm) 注意:我使用的是叮当工具链 我发现这很有帮助 基本上,这是以下步骤: (使用-DLLVM\u EXPERIMENTAL\u TARGETS\u TO\u build=WebAssembly构建llvm和clang 5.0.0或更高版本 使用以下命令将.cpp源编译为llvm位代码: clang-emit llvm--target=wasm32-Oz math.cpp-c-o math.bc 将位代码编译为s-assembly: llc-

如何将其编译为WebAssembly(
math.wasm

注意:我使用的是叮当工具链

我发现这很有帮助

基本上,这是以下步骤:

  • (使用
    -DLLVM\u EXPERIMENTAL\u TARGETS\u TO\u build=WebAssembly构建llvm和clang 5.0.0或更高版本
  • 使用以下命令将.cpp源编译为llvm位代码:

    clang-emit llvm--target=wasm32-Oz math.cpp-c-o math.bc

  • 将位代码编译为s-assembly:

    llc-asm verbose=false-o math.s math.bc

  • 使用的s2wasm工具创建.wast文件

    s2wasm math.s>math.wast

  • 使用的wast2wasm工具将文本.wast文件转换为二进制.wasm:

    wast2wasm-o math.wasm math.wast

  • 有些步骤感觉多余,但我还没有找到一个允许快捷方式的工具。(如果llc可以直接编译到.wasm,或者如果s2wasm真的像名字所暗示的那样创建了二进制.wasm文件,那就太好了。)总之,一旦工具链运行起来,它就相对轻松了。注意,Web组件没有C或C++标准库。

    或者,如果您需要.wasm文件只是为了尝试一些东西,那么您可以不必担心所有的工具链问题。浏览并下载编译的.wasm文件


    感谢@noontz和@LB--指出这一点


    实际上,正如要点中的注释所建议的,您可以跳过binaryen,直接从Clang/LLVM编译到wasm。我现在使用C++的以下命令行:

    clang++ test.cpp -ObjC++ --compile --target=wasm32-unknown-unknown-wasm \ 
            --optimize=3 --output test.wasm
    

    目前编译C和C++最简单的方法是用。您提到的组件都是组件,但emscripten是一个完整的工具链,支持构建端到端,包括您需要的所有部分,包括libc/libc++,以及各种其他有用的库。它支持同时针对asm.js和wasm。

    这个答案有点晚了,但是在线有漂亮的工具来编译脚本

    举个例子,我用的是这个。一个给你极小的编译选项(C,C++,STD99…),但是有足够的:

    根据您将如何使用它,您可以选择不同的语言,如x86、代码缓冲区。你也可以共享你的代码,当我和其他好友合作时,我发现了一些很酷的函数::(<

    )附带了你需要把C++文件编译成WASM所需要的一切。Emscripten还提供了一个解决方案,在安装所有必要的工具时,它可以让生活变得轻松

    但是,默认情况下,Emscripten将向wasm文件添加一些框架代码,并生成一些html和javascript

    可以使用Emscripten创建一个最小的wasm文件,该文件不包含任何框架代码、javascript或html。在使用
    emcc
    em++
    编译时,使用选项
    -s-SIDE\u MODULE=1-Oz-s ONLY\u MY\u code=1
    ,将获得最小的wasm文件

    以下命令将使用示例和Emscripten导出最小wasm文件:


    em++math.cpp-o math.wasm-Oz-s SIDE_MODULE=1-s wasm=1-s“EXPORTED_FUNCTIONS=['''u add']]-s ONLY_MY_code=1

    基于此线程中的答案,我创建了一点

    对我来说,最简单的方法是在我的机器上编译(网站也是一个很好的起点!),将代码编译成wasm,生成适当的绑定,并将所有这些隐藏在JS端的包装器中,这样我就可以得到一个很好的界面

    < >由于C++的名称的限制,我发现用C开始更容易。

    2019,CLAN(8)支持WebBaseBooL.这里是一个存储库,包含编译、链接和运行简单的.wasm文件所需的一切


    一般来说,这是一个很好的建议—使用emscripten构建要容易得多—但对于这个问题,这一点都不重要。Emscripten将创建比步骤大几个数量级的文件before@KarelBílek这个答案发布时可能是真的,但现在已经不是了。看看我的答案。实际上,正如要点中的注释所建议的那样,您可以跳过binaryen,直接从Clang/LLVM编译到wasm。我现在使用C++的以下命令行:<代码> CLAN+Test.CPP-Objc++——编译-Talk=WASM32未知未知WASM——优化= 3输出测试。WASM <代码> NoOnz UH,很好…看来还是值得一读要点评论;)如果有人能独立确认这一点(或者在我尝试之后),我会将其编辑到答案中。我可以确认noontz命令可以使用LLVM 7生成.wasm文件,但我还没有尝试运行它。谢谢@LB--。我把你的评论和对noontz的投票作为证明。不幸的是,我还没有亲自尝试:)这很有趣,但在构建整个项目时不是一个现实的选择。我需要可以在本地和CI服务器上运行的东西。尝试此操作时出现错误:
    分配不存在的设置属性“WASM”
    我得到“dyncall undefined”。我已经完成了EnScript,它不再是一个解决方案。当我们使用C++的很多外部库时,ESCRAMTEN好吗?需要注意的是,这只对小代码起作用。不能在MaOS(107.6)上运行这一点——与已经提交的回购协议相同的问题。