Rust链接自定义lib_dens-mods.so与lib_twobody.so失败求助
解决Rust链接自定义.so库时ld找不到库的问题
核心原因
链接器ld在处理-lxxx参数时,会自动查找libxxx.so文件。你当前的#[link]注解里写了完整的lib_xxx前缀,导致ld去查找不存在的liblib_dens-mods.so和liblib_twobody.so,这是错误的根源。
具体解决步骤
1. 修正#[link]注解的库名
把注解里的name值去掉lib_前缀,只保留核心库名:
// 错误写法:包含了lib_前缀 // #[link(name = "lib_dens-mods")] // 正确写法:只保留lib_之后的部分 #[link(name = "dens-mods")] extern "C" { // 这里写你的C函数声明 } // 同理处理第二个库 #[link(name = "twobody")] extern "C" { // 第二个库的函数声明 }
2. 确保build.rs正确配置库路径和链接规则
如果你的.so文件不在系统默认的链接路径(如/usr/lib)里,必须在build.rs中指定库的所在目录,同时明确链接动态库:
fn main() { // 替换为你的.so文件所在的实际路径(相对项目根目录或绝对路径) println!("cargo:rustc-link-search=native=./third-party-libs"); // 指定链接动态库,名字同样去掉lib_前缀 println!("cargo:rustc-link-lib=dylib=dens-mods"); println!("cargo:rustc-link-lib=dylib=twobody"); }
3. 验证配置正确性
执行cargo build -v查看详细编译日志,检查ld的参数是否符合预期:
- 应该看到
-L ./third-party-libs(你指定的库路径) - 应该看到
-l dens-mods和-l twobody,而不是-llib_dens-mods
4. 额外检查项
- 确认.so文件的命名完全正确:
lib_dens-mods.so和lib_twobody.so(注意下划线、连字符的拼写) - 如果是Linux系统,临时测试可以设置环境变量:
export LD_LIBRARY_PATH=/path/to/your/libs:$LD_LIBRARY_PATH,再执行cargo build(但这只是临时方案,最终依赖build.rs配置更可靠)
内容的提问来源于stack exchange,提问作者Alex Long
相关产品推荐
相关产品推荐

