在带有 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
标志。
我正在尝试制作一个在 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
标志。