【问题标题】:Disable/rename imports from host environment "env"从主机环境“env”禁用/重命名导入
【发布时间】:2017-12-22 10:13:54
【问题描述】:

在将 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)))这行意味着它试图请求函数afuncfrom the host environment。但是,我没有发现应该将主机环境命名为 env 的文档。

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

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

【问题讨论】:

  • 你用什么命令来编译你的cpp文件浪费了?
  • this answer中描述的命令。

标签: c++ c webassembly


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 2021-06-16
  • 2017-07-03
  • 2020-06-28
  • 2019-01-27
  • 2017-06-23
  • 1970-01-01
相关资源
最近更新 更多