在带有 Emscripten 的 Nim 中使用字符串会导致 JavaScript 错误

Using strings in Nim with Emscripten causes JavaScript error

我正在尝试制作一个在 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.

这是一个JSFiddle of the two Emscripten output files。 (它们对于 Stack Snippet 来说太大了。)

Emscripten 1.35.0 可能太旧,没有 UTF8ToString 功能。您的示例在 Emscripten 1.37.1 上对我来说效果很好。

附带说明一下,我注意到您使用的是固定的 Emscripten 堆大小。如果你想要动态增长堆,你可以使用 -s ALLOW_MEMORY_GROWTH=1 标志。