[英]Passing a JavaScript array of strings to a C function with Emscripten
[英]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。
這是兩個Emscripten輸出文件的JSFiddle 。 (對於堆棧代碼段,它們太大了。)
Emscripten 1.35.0可能太舊了,無法使用UTF8ToString
函數。 您的示例對於Emscripten 1.37.1來說對我來說效果很好。
附帶說明,我注意到您使用的是固定的Emscripten堆大小。 如果要動態增長堆,可以使用-s ALLOW_MEMORY_GROWTH=1
標志。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.