Javascript 编译C++;使用Emscripten编写独立Wasm的代码会导致.Wasm需要某些导入函数 我试图用EnScript作为一个学习机会,编译一个完整的C++程序。以下命令不会生成完全有效且有效的HTML+JS+Wasm: emcc main.cpp[…库]-Oz--std=c++17-o output.html\ -s“导出的函数=[''求解']

Javascript 编译C++;使用Emscripten编写独立Wasm的代码会导致.Wasm需要某些导入函数 我试图用EnScript作为一个学习机会,编译一个完整的C++程序。以下命令不会生成完全有效且有效的HTML+JS+Wasm: emcc main.cpp[…库]-Oz--std=c++17-o output.html\ -s“导出的函数=[''求解'],javascript,llvm,webassembly,Javascript,Llvm,Webassembly,但是,当我试图生成独立的Wasm二进制文件时,出现了以下错误,即: emcc main.cpp[…库]-Oz--std=c++17-o output.wasm\ -s“导出的函数=[''求解'] 并在JS中实例化: /`buffer`是预定义的,在类型化数组中包含wasm二进制文件。 const module=新的WebAssembly.module(缓冲区); //“imports”是值和函数的对象。 新的WebAssembly.Instance(模块,导入); 导入函数env:_asse

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

emcc main.cpp[…库]-Oz--std=c++17-o output.wasm\
-s“导出的函数=[''求解']
并在JS中实例化:

/`buffer`是预定义的,在类型化数组中包含wasm二进制文件。
const module=新的WebAssembly.module(缓冲区);
//“imports”是值和函数的对象。
新的WebAssembly.Instance(模块,导入);
导入函数env:_assert必须是可调用的(评估“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\u ASYNC\u COMPILATION=0
选项来实现您的目标


为了回答更广泛的问题,emscripten构建的wasm文件对emscripten JS库代码相当厌倦。对于构建独立的wasm文件有一些支持,并且随着时间的推移,这种支持也在不断改进,但是在一般情况下,完全按照wasm文件进行操作是不可能的。

Hi sbc100感谢您的回答!从您的回答来看,创建一个不依赖于任何JS的纯Wasm二进制文件目前是相当具有挑战性和不可能的。还感谢您让我知道snort的异步编译标志!