如何在Blazor项目中接入C++库?编译及运行报错求助
问题分析与解决
错误1:lib.wasm: not a relocatable wasm file
Blazor WebAssembly 的 <NativeFileReference> 仅支持可重定位的 WASM 目标文件(.o 或 .a),而你使用 -s SIDE_MODULE=1 编译出的是独立运行的 WASM 模块,并非可重定位格式,因此编译报错。
错误2:missing function: mult
C++ 编译器会对函数名进行名字修饰(Name Mangling),比如你的 mult 函数会被编译为类似 _Z4multi 的符号,但 C# 的 DllImport 只会查找未修饰的 mult 符号,导致找不到函数。
正确操作步骤
1. 修改 C++ 代码,避免名字修饰
用 extern "C" 包裹导出函数,强制编译器按照 C 语言的符号规则生成函数名:
#include <emscripten.h> extern "C" { EMSCRIPTEN_KEEPALIVE int mult(int i) { return i * 4; } }
2. 用 em++ 编译生成可重定位目标文件
使用 -c 参数仅编译源文件,生成可重定位的 .o 文件,符合 Blazor 的要求:
em++ test.cpp -c -o lib.o -Oz
-c:只编译不链接,生成目标文件-Oz:优化编译结果(可选,用于减小文件体积)
3. 配置 csproj 引用目标文件
保持 <NativeFileReference> 引用生成的 .o 文件:
<NativeFileReference Include="lib.o" />
4. 保持 C# 调用代码不变
你的 Blazor 页面代码无需修改,DllImport("lib") 可以正确找到 mult 函数:
[DllImport("lib")] static extern int mult(int n);
内容的提问来源于stack exchange,提问作者hoksly
相关产品推荐
相关产品推荐

