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

.Net调用Linux共享对象(.so)库时加载失败求助

解决WSL中调用MinGW编译的.so库找不到的问题

1. 遵循Linux动态库命名规范

Linux下动态库默认采用libxxx.so的命名格式,你用MinGW编译的test.so不符合这个规范,系统会自动查找libtest.so。可二选一解决:

  • 编译时指定输出名称:在编译命令中添加-o libtest.so,然后将C#代码中的DllImport改为[DllImport("libtest.so", ...)]
  • 给现有库创建软链接:在WSL终端执行ln -s test.so libtest.so

2. 让动态库搜索路径包含当前目录

Linux默认不会从当前工作目录加载动态库,可通过两种方式处理:

  • 临时设置环境变量:运行C#程序前执行export LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH
  • 在DllImport中使用绝对路径,示例:
    [DllImport("/home/your-user/path/to/test.so", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern IntPtr VerifyCert();
    

3. 改用WSL原生GCC编译库

MinGW是Windows平台的工具链,编译出的.so可能和WSL的Linux环境存在兼容性问题(如依赖的系统库版本不匹配)。直接在WSL内安装原生GCC编译:

sudo apt install gcc g++
g++ -shared -fPIC your-source.cpp -o libtest.so

原生编译的库更适配WSL环境。

4. 确保C++函数以C风格导出

C++会对函数名进行名字修饰(mangling),导致C#无法匹配到正确的符号。必须用extern "C"包裹导出函数:

extern "C" {
    __declspec(dllexport) void* VerifyCert() {
        // 你的函数实现
    }
}

Linux下编译时__declspec(dllexport)可省略,但extern "C"必须保留,确保符号名是未修饰的VerifyCert。

内容的提问来源于stack exchange,提问作者Nikitos Kiwi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:47:38