使用zig cc编译Wasm时,无法在C代码中调用JS暴露函数的问题求助
使用zig cc编译Wasm时,无法在C代码中调用JS暴露函数的问题求助
我正在用C写一个WebAssembly Demo,用来对应之前用Zig写的类似Demo。目前我已经能从JS调用C函数,也能在两边交互共享内存,但怎么都没法把JS的变量和函数暴露给C程序用。有没有人熟悉这种方式写C的?我怀疑是不是未定义符号被优化掉了?
我用的是zig cc(本质是clang)编译到Wasm,Zig版本是0.13.0-dev.351+64ef45eb0,clang版本16.0.0,系统是macOS Sequoia 15.0.1(aarch64架构)。
以下是我目前写的代码:
resource.c
#include <stdlib.h> void print_test(void); // 我想调用的JS函数 const unsigned char heap[4096]; int __attribute__((export_name("memstart"))) memstart() { return (int)&heap; } int __attribute__((export_name("return5"))) return5(int p) { return 5 * p; } int __attribute__((export_name("entryAt"))) entryAt(int p) { print_test(); return heap[p]; }
index.html
<!DOCTYPE html> <html lang="en"> <head> <title>For Stephen</title> </head> <body> <input id="input" type="number" placeholder="int param..."></input> <input id="bytes" placeholder="bytes..."></input> <pre id="output">output goes gere</pre> <button id="button_r5">Return 5</button> <button id="button_nth">Get nth byte</button> <canvas id="my_canvas"></canvas> <script> const c = {}; const encoder = new TextEncoder(); const decoder = new TextDecoder(); const importObject = { "env": { "print_test": () => console.log("test print") } }; WebAssembly.instantiateStreaming(fetch("resource.wasm", importObject)) .then(result => { const {memory, memstart, return5, entryAt} = result.instance.exports; console.log(memstart); c.buffer = new Uint8Array(memory.buffer, memstart()); c.return5 = return5; c.entryAt = entryAt; }); const button_r5 = document.getElementById("button_r5"); const button_nth = document.getElementById("button_nth"); const input = document.getElementById("input"); const bytes = document.getElementById("bytes"); const output = document.getElementById("output"); button_r5.addEventListener("click", ()=>{ output.textContent = c.return5(input.value); }); button_nth.addEventListener("click", ()=>{ c.buffer.set(encoder.encode(bytes.value)); output.textContent = c.entryAt(input.value); }); </script> </body> </html>
构建命令
zig cc -target wasm32-freestanding -g resource.c -lc -Wl,--no-entry -o resource.wasm
备注:内容来源于stack exchange,提问作者J. B
相关产品推荐
相关产品推荐

