2

在将 C 或 C++ 编译为 Web 程序集 ( clang/llvm/binaryen ) 时,未定义的函数将从“env”中导入。

例如

extern "C" int afunc();

int main() {
  return afunc();
}

编译为

(module
  (type $FUNCSIG$i (func (result i32)))
  (import "env" "afunc" (func $afunc (result i32)))
  (table 0 anyfunc)
  (memory $0 1)
  (export "memory" (memory $0))
  (export "main" (func $main))
  (func $main (result i32)
    (call $afunc)
  )
)

我猜这行(import "env" "afunc" (func $afunc (result i32)))意味着它试图afunc 从主机环境请求函数。但是,我没有发现应该将主机环境命名为env.

是否可以对这些主机进口施加一些控制?具体来说,

  • 我可以将其重命名为 以外的名称env吗?
  • 是否可以禁用此行为,以便在未定义函数时出现链接器错误(可能除非它是已知在主机中可用的函数)?
4

1 回答 1

1

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

“env”位是s2wasm设计用于 emscripten 的默认行为。Emscripten 拥有标准库(例如 libc)并将它们链接到您的代码中,它还提供了一些作为 JavaScript 代码的功能,这些代码也自动包含在您的模块中。它设置env导入并使用它自动实例化您的模块。

于 2017-07-18T07:03:59.387 回答