代码改变世界

编译 C++ 代码为 WebAssembly

2025-03-29 23:02  flyfish163  阅读(140)  评论(0)    收藏  举报

spellcheck.cpp文件内容

为简化起见,先不放自己的代码,只放示例中最简单的代码。

#include <emscripten/bind.h>  // Emscripten 绑定头文件
#include <string>
    using namespace emscripten;
 
// 假设这是你原有的拼写检查函数
bool checkSpelling(const std::string &word) {
    // 你的拼写检查逻辑...
    return true;  // 示例返回值
}

// 包装函数,供 JavaScript 调用
bool checkSpellingWrapper(const std::string &word) {
    return checkSpelling(word);
}

// 使用 Emscripten 绑定导出函数
EMSCRIPTEN_BINDINGS(spellcheck_module) {
    emscripten::function("checkSpelling", &checkSpellingWrapper);
}

 

第三步:编译 C++ 代码为 WebAssembly

使用 Emscripten 的 emcc 命令将代码编译为 .wasm 和 .js 文件

执行命令

emcc -o spellcheck.js spellcheck.cpp -O3 -s WASM=1 -s MODULARIZE=1 -s "EXPORTED_RUNTIME_METHODS=['ccall']" --bind                  
成功生成Js文件
 
 

第四步:创建前端页面调用 WASM

把范例中的hmtl文件原样拷贝,保存成sample.html

<!DOCTYPE html>
<html>
<head>
    <title>拼写检查工具</title>
</head>
<body>
    <input type="text" id="wordInput" placeholder="输入单词">
    <button onclick="checkSpelling()">检查</button>
    <div id="result"></div>

    <!-- 加载生成的 JS 文件 -->
    <script src="spellcheck.js"></script>
    <script>
        // 等待 WASM 模块初始化完成
        Module.onRuntimeInitialized = () => {
            console.log("WASM 模块已加载!");
        };

        // 调用 C++ 函数
        function checkSpelling() {
            const word = document.getElementById('wordInput').value;
            
            // 使用 ccall 调用 C++ 函数
            const result = Module.ccall(
                'checkSpelling',  // C++ 函数名
                'boolean',        // 返回值类型
                ['string'],       // 参数类型数组
                [word]            // 参数值数组
            );

            // 显示结果
            document.getElementById('result').innerHTML = 
                result ? '✓ 拼写正确' : '✗ 拼写错误';
        }
    </script>
</body>
</html>

  

第五步:本地测试与调试

 方法一:使用 VS Code 的 Live Server 扩展

Live Server 是一个 VS Code 插件,它允许开发者在本地快速搭建一个具有实时加载功能的小型服务器,用于实时预览 HTML、CSS 和 JavaScript 文件的更改。这个插件特别适合前端开发,因为它可以在代码修改后自动刷新页面,从而提高开发效率。

安装步骤

  1. 在 VS Code 中打开扩展面板,可以通过点击侧边栏的扩展图标或通过菜单栏的查看 > 扩展来访问。

  2. 在扩展搜索栏中输入“Live Server”并找到插件。

  3. 点击安装按钮,等待插件安装完成。

  4. 安装完成后,重启 VS Code 以确保插件正常工作。

使用方法

  1. 在 VS Code 中打开你的项目文件夹,确保它单独出现在侧边栏中。

  2. 打开你想要预览的 HTML 文件。

  3. 右键点击文件并选择 Open with Live Server,或者点击状态栏底部的 Go Live 按钮。

  4. 这将自动在默认浏览器中打开文件,并在你保存文件时刷新页面。

 

调试技巧1:浏览器开发者工具

把上面生成的spellcheck.js,spellcheck.wasm,sample.html 都放在spellcheck.cpp 相同目录下,
右键点击文件并选择 Open with Live Server,sample.html在默认浏览器中打开了,如图1左侧;
 
按F12打开浏览器控制台,如图1右侧。  //控制台Console标签页有个 favicon.ico 没有找到的错误,影响不大,先不理会。
图1

技能1:添加断点,单步调试。

打开控制台Source标签页,选择sample.html, 

找到function checkSpelling() 函数,在函数第一行代码L21处,鼠标右键右击行号21,会弹出菜单,如图2

图2

 

选择Add breakpoint,可以添加断点,如图3,同时右边小窗口Breakpoints节点下面也显示sample.html L21处有断点。

图3

 

 在左边网页文本框中输入字符串,点击检查,可以看到程序在F12窗口sample.html L21处被断点停住,点击工具栏小图标(或者按F10键)单步执行,

就可以看到L21行变量word已经获得了用户输入到文本框中的字符串"abd"了。           //见图4右边小窗口Local 节点下面的word变量值。

图4

 

遇到问题:Uncaught TypeError: Module.ccall is not a function 

图4 L24行运行到Module.call时候,执行报错,Uncaught TypeError: Module.ccall is not a function,如图5

图5

未解决。