Mac环境下WebAssembly集成libsodium编译报错求助
问题根源
你用brew装的libsodium是macOS原生架构(x86_64/arm64)的库,而Emscripten的emcc只能识别WebAssembly目标的二进制文件,直接混用原生库肯定会报「不是Wasm对象」的警告,以及符号未定义错误。另外embind的错误大多是因为编译时没加启用embind的参数。
正确做法:为WebAssembly交叉编译libsodium
libsodium官方支持Emscripten编译,按以下步骤来:
1. 激活Emscripten环境
先确保你的emsdk环境已经正确激活(每次新开终端都要执行,或者把这行加到shell配置文件里):
source /path/to/emsdk/emsdk_env.sh
2. 拉取libsodium源码
git clone https://github.com/jedisct1/libsodium.git cd libsodium git checkout stable
3. 配置交叉编译
用Emscripten的emconfigure工具指定WebAssembly目标,同时设置安装路径(自定义即可):
emconfigure ./configure --host=wasm32 --prefix=/Users/xxx/libsodium-wasm
4. 编译安装
用emmake调用make完成编译和安装:
emmake make emmake make install
完成后,指定的--prefix目录下会有lib/libsodium.a(WebAssembly版静态库)和include头文件。
编译你的C++模块
编译时要把这些参数加全:
--bind:启用embind支持-I:指定libsodium头文件路径-L:指定libsodium静态库路径-lsodium:链接libsodium库
示例命令:
emcc your_module.cpp \ --bind \ -I/Users/xxx/libsodium-wasm/include \ -L/Users/xxx/libsodium-wasm/lib \ -lsodium \ -o your_module.js
排查小技巧
- 要是libsodium编译报错,先确认
emcc --version能正常输出,说明emsdk环境激活没问题。 - 还出现符号错误的话,检查代码里有没有正确
#include <sodium.h>,以及编译时是不是真的用了WebAssembly版的库,别又混了brew装的原生库。 - embind的符号错误必须加
--bind参数,这个参数会自动帮你链接embind需要的依赖。
内容的提问来源于stack exchange,提问作者Safari
相关产品推荐
相关产品推荐

