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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:25:34