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

从Rust调用Go函数时遭遇共享库链接错误求助

解决MacOS下Rust链接Go生成的C共享库失败问题

问题根源

MacOS的动态链接器与Linux存在差异:

  • 共享库默认后缀为.dylib而非.so
  • 构建时搜索库的环境变量是LIBRARY_PATH,运行时依赖DYLD_LIBRARY_PATH(而非Linux的LD_LIBRARY_PATH)
  • 链接器ld处理-lHello参数时,会优先查找libHello.dylib格式的库文件

修复步骤

1. 重新生成符合MacOS规范的Go共享库

修改Go编译命令,生成.dylib格式的标准共享库:

go build -o libHello.dylib -buildmode=c-shared hello.go

将生成的libHello.dylib和Hello.h移动到Rust项目的src目录(或项目根目录下新建lib文件夹统一存放)。

2. 配置Rust项目的链接参数

有两种方式可选:

方式一:通过build.rs自动配置(推荐)

在Rust项目根目录创建build.rs文件,内容如下:

fn main() {
    // 指定库文件所在路径(这里假设库在src目录)
    println!("cargo:rustc-link-search=./src");
    // 指定要链接的库名(对应libHello.dylib的Hello部分)
    println!("cargo:rustc-link-lib=Hello");
}

Cargo构建时会自动读取该文件的配置,无需手动设置环境变量。

方式二:手动设置环境变量

保持main.rs代码不变,构建前先设置LIBRARY_PATH指定库搜索路径:

export LIBRARY_PATH="$LIBRARY_PATH:./src"
cargo build

运行程序时需要设置DYLD_LIBRARY_PATH让系统找到动态库:

export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:./src"
cargo run

3. 验证运行

执行cargo run,正常情况下会输出:

Hello Go C-Shared

内容的提问来源于stack exchange,提问作者Kelong Chen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:07:42