You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 10:25:26