从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
相关产品推荐
相关产品推荐

