如何编译C++;文件到WebAssembly? 假设我有一个简单的、自包含的C++文件(数学.CPP < /代码>)如下: int add(int x, int y) { return x + y; }
如何将其编译为WebAssembly(如何编译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-
math.wasm
)
注意:我使用的是叮当工具链 我发现这很有帮助
基本上,这是以下步骤:
-DLLVM\u EXPERIMENTAL\u TARGETS\u TO\u build=WebAssembly构建llvm和clang 5.0.0或更高版本
clang-emit llvm--target=wasm32-Oz math.cpp-c-o math.bc
llc-asm verbose=false-o math.s math.bc
s2wasm math.s>math.wast
wast2wasm-o math.wasm math.wast
感谢@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)上运行这一点——与已经提交的回购协议相同的问题。