gpt4 book ai didi

javascript - 使用 Emscripten 将 C++ 代码编译为独立的 Wasm 会导致 .wasm 需要某些导入函数

转载 作者:行者123 更新时间:2023-11-29 22:47:43 27 4
gpt4 key购买 nike

我正在尝试使用 Emscripten 作为学习机会将完整的 C++ 程序编译为 Wasm。以下命令确实生成了完整有效且有效的 HTML+JS+Wasm:

emcc main.cpp [...libraries] -Oz --std=c++17 -o output.html\
-s "EXPORTED_FUNCTIONS=['_solve']"

但是,当我尝试生成独立的 Wasm 二进制文件时出现以下错误,即:

emcc main.cpp [...libraries] -Oz --std=c++17 -o output.wasm\
-s "EXPORTED_FUNCTIONS=['_solve']"

并在 JS 中实例化它:

// `buffer` is pre-defined and contains the wasm binary in a typed array.
const module = new WebAssembly.Module(buffer);
// `imports` is an object of values and functions.
new WebAssembly.Instance(module, imports);

import function env:_assert must be callable (evaluating 'new WebAssembly.Instance(module, imports)')

检查生成的 Wasm 二进制文件表明它需要主机环境提供相当长的函数和变量列表:

  (import "env" "_abort" (func (;0;) (type 12)))
(import "env" "___assert_fail" (func (;1;) (type 13)))
(import "env" "abort" (func (;2;) (type 7)))
(import "env" "_llvm_stacksave" (func (;3;) (type 21)))
(import "env" "_llvm_stackrestore" (func (;4;) (type 7)))
(import "env" "_getenv" (func (;5;) (type 2)))
(import "env" "___setErrNo" (func (;6;) (type 7)))
(import "env" "___unlock" (func (;7;) (type 7)))
(import "env" "___syscall140" (func (;8;) (type 1)))
(import "env" "___map_file" (func (;9;) (type 1)))
(import "env" "___lock" (func (;10;) (type 7)))
(import "env" "___cxa_uncaught_exceptions" (func (;11;) (type 21)))
(import "env" "___cxa_throw" (func (;12;) (type 6)))
(import "env" "___cxa_pure_virtual" (func (;13;) (type 12)))
(import "env" "abortOnCannotGrowMemory" (func (;14;) (type 2)))
(import "env" "_strftime_l" (func (;15;) (type 10)))
(import "env" "_pthread_cond_wait" (func (;16;) (type 1)))
(import "env" "_llvm_trap" (func (;17;) (type 12)))
(import "env" "___cxa_allocate_exception" (func (;18;) (type 2)))
(import "env" "_emscripten_resize_heap" (func (;19;) (type 2)))
(import "env" "_emscripten_memcpy_big" (func (;20;) (type 3)))
(import "env" "_emscripten_get_heap_size" (func (;21;) (type 21)))
(import "env" "___wasi_fd_write" (func (;22;) (type 9)))
(import "env" "___syscall91" (func (;23;) (type 1)))
(import "env" "___syscall6" (func (;24;) (type 1)))
(import "env" "__table_base" (global (;0;) i32))
(import "env" "DYNAMICTOP_PTR" (global (;1;) i32))
(import "global" "NaN" (global (;2;) f64))
(import "global" "Infinity" (global (;3;) f64))
(import "env" "memory" (memory (;0;) 256 256))
(import "env" "table" (table (;0;) 725 725 funcref))

我可以指示 Emscripten 将源代码编译为完整的 JS + Wasm 包或纯 JS 文件,但是:

  • 一个完整的 JS + Wasm 包:Emscripten 异步加载 WASM 二进制文件,这在我的情况下是有问题的(确切原因超出了这个问题的范围。)
  • 纯 JS 文件:文件非常大,而且已经不是 Wasm。

我的问题是:有没有一种方法可以在删除那些依赖项或直接在二进制文件中实现这些依赖项的情况下进行编译?如果没有,是否有库(最好是轻量级的)可以为这些功能提供实现?

最佳答案

更新:emscripten 现在支持 -s STANDALONE_WASM,它将构建尽可能可移植的 wasm 文件。对于低级系统调用,生成的二进制文件将使用 WASI 系统调用。

首先,听起来您可以通过使用 -s WASM_ASYNC_COMPILATION=0 选项来实现您的目标。

为了回答更广泛的问题,emscripten 构建的 wasm 文件相当累 emscripten JS 库代码。对构建独立的 wasm 文件有一些支持,并且随着时间的推移,这种支持正在得到改进,但在一般情况下,不可能有完全同步的 wasm 文件。

关于javascript - 使用 Emscripten 将 C++ 代码编译为独立的 Wasm 会导致 .wasm 需要某些导入函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58045191/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com