如何导出集成C动态库的Rust库?解决二进制包链接时找不到依赖C共享库的问题
解决Rust二进制包链接含C共享库的Rust库时找不到.so文件的问题
这个问题我之前也踩过坑,核心原因是你搞混了运行时动态库查找和编译链接阶段库查找的区别——LD_LIBRARY_PATH是给程序运行时用的,链接器(ld)在编译二进制的时候根本不看它!下面是几个靠谱的解决办法:
1. 让你的rust-lib主动告诉依赖项库的位置(最推荐)
在rust-lib的build.rs里,除了调用make编译C共享库之外,还要添加两行关键输出:
// 替换成你的libcuda_wrapper.so所在的实际目录,比如make输出的子目录路径 let so_dir = "./path/to/c-shared-lib/output"; // 告诉Cargo把这个目录添加到链接器的搜索路径里 println!("cargo:rustc-link-search=native={}", so_dir); // 告诉链接器要链接这个动态库 println!("cargo:rustc-link-lib=dylib=cuda_wrapper");
Cargo会自动把这些信息传递给所有依赖这个rust-lib的项目,包括你的rust-bin,这样链接器就能找到libcuda_wrapper.so了。
2. 给rust-bin的链接器手动指定搜索路径
如果上面的方法没生效(比如rust-lib的build.rs没正确输出指令),可以直接在rust-bin的.cargo/config.toml里添加链接参数:
[target.x86_64-unknown-linux-gnu] # 替换成你的实际路径:第一个是rust-lib编译后的依赖目录,第二个是C共享库的输出目录 rustflags = [ "-L", "./path/to/rust-lib/target/debug/deps", "-L", "./path/to/c-shared-lib/output" ]
注意如果是release构建,把debug换成release即可。
3. 应急方案:把共享库放到系统标准路径(不推荐)
如果只是临时测试,可以把libcuda_wrapper.so拷贝到系统默认的库路径,比如:
sudo cp libcuda_wrapper.so /usr/local/lib/ sudo ldconfig
但这种方法不适合开发环境,容易出现多版本冲突,尽量只用在紧急测试场景。
为什么LD_LIBRARY_PATH没用?
再唠叨一句:LD_LIBRARY_PATH是程序运行起来之后用来查找动态库的,而你现在的问题是编译链接阶段找不到库,这时候链接器ld只认通过-L参数指定的路径,或者系统默认的库目录,跟LD_LIBRARY_PATH完全没关系。
内容的提问来源于stack exchange,提问作者unegare
相关产品推荐
相关产品推荐

