编译 C++ 代码为 WebAssembly
2025-03-29 23:02 flyfish163 阅读(140) 评论(0) 收藏 举报spellcheck.cpp文件内容
为简化起见,先不放自己的代码,只放示例中最简单的代码。
#include <emscripten/bind.h> // Emscripten 绑定头文件 #include <string>
// 假设这是你原有的拼写检查函数
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 文件
执行命令
第四步:创建前端页面调用 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>
第五步:本地测试与调试
Live Server 是一个 VS Code 插件,它允许开发者在本地快速搭建一个具有实时加载功能的小型服务器,用于实时预览 HTML、CSS 和 JavaScript 文件的更改。这个插件特别适合前端开发,因为它可以在代码修改后自动刷新页面,从而提高开发效率。
安装步骤
-
在 VS Code 中打开扩展面板,可以通过点击侧边栏的扩展图标或通过菜单栏的查看 > 扩展来访问。
-
在扩展搜索栏中输入“Live Server”并找到插件。
-
点击安装按钮,等待插件安装完成。
-
安装完成后,重启 VS Code 以确保插件正常工作。
使用方法
-
在 VS Code 中打开你的项目文件夹,确保它单独出现在侧边栏中。
-
打开你想要预览的 HTML 文件。
-
右键点击文件并选择 Open with Live Server,或者点击状态栏底部的 Go Live 按钮。
-
这将自动在默认浏览器中打开文件,并在你保存文件时刷新页面。
调试技巧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

未解决。
浙公网安备 33010602011771号