1

我正在尝试制作一个在 Emscripten 上运行的简单 Nim 应用程序。我还jsbind用来调用 JavaScript 函数,即console.log.

我有以下文件test.nim

import jsbind

type Window* = ref object of JSObj
type Console* = ref object of JSObj

proc getConsole*(): Console {.jsimportgWithName: "function(){return console;}".}

proc log*(c: Console, a: any) {.jsimport.}

echo("Before log")
getConsole().log("Hello")
echo("After log")

nim.cfg的是:

@if emscripten:
  cc = clang
  gc = none
  clang.exe = "emcc"
  clang.linkerexe = "emcc"
  clang.options.linker = ""
  cpu = "i386"
  out = "index.html"
  passC = "-Iemscripten"
  passL = "-Lemscripten -s TOTAL_MEMORY=335544320"
@end

然后我编译:

nim c -d:emscripten --out=index.html test.nim

然后,当我index.html在浏览器中打开并进行getConsole().log调用时,我收到许多关于UTF8ToString未定义函数的控制台错误,并且程序终止:

在此处输入图像描述

这个函数似乎是一个 Emscripten 前奏函数——我如何确保这个函数和我需要的任何其他函数都包含在我的 JavaScript 输出中?

启用和不启用 WebAssembly 选项都会发生此错误。我正在使用 Nim 0.16.0 和 emcc 1.35.0。

这是两个 Emscripten 输出文件的 JSFiddle。(它们对于堆栈片段来说太大了。)

4

1 回答 1

4

Emscripten 1.35.0 可能太旧而无法UTF8ToString发挥作用。您的示例适用于 Emscripten 1.37.1。

作为旁注,我注意到您使用的是固定的 Emscripten 堆大小。如果您想要动态增长的堆,您可以使用-s ALLOW_MEMORY_GROWTH=1标志。

于 2017-05-08T07:19:33.440 回答