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

标签 javascript emscripten nim-lang asm.js webassembly

我正在尝试制作一个在 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 未定义,程序终止:

enter image description here

这个函数似乎是一个 Emscripten prelude 函数 - 我如何确保这个函数和我需要的任何其他函数都包含在我的 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 标志。

关于javascript - 在带有 Emscripten 的 Nim 中使用字符串会导致 JavaScript 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43830559/

相关文章:

javascript - 按钮的onclick事件触发onload

javascript - 我想显示该 div 来代替另一个 div

emscripten - 如何使用 emscripten 将文件从 C 保存到浏览器存储

javascript - 如何桥接 JavaScript(参差不齐)数组和 std::vector<std::vector<T>> 对象?

javascript - 来自 C 代码的异步 javascript 库调用完成得太晚

nim-lang - 如何使用 nim 调整 Windows 上的显示分辨率

nim-lang - 如何从 Nim 中的异常获取堆栈跟踪?

javascript - NAPI 插件 : how to return value to javascript from c++ CALLBACK?

nim-lang - 如何模块化/抽象掉 os.walkDir 和 os.walkDirRec - Nim

javascript - 即使页面关闭/刷新后也存储按钮属性