如何构建包含所有依赖项的单个.rlib文件?
问题原因
你通过cargo build --lib生成的mylib.rlib是Rust专属的库格式,它只包含当前自定义库的代码,并不会打包其依赖的第三方crates。当你用rustc直接编译main.rs时,rustc无法自动定位这些依赖的crates,因此抛出找不到依赖的错误。
解决方案
Rust的rlib格式本身不支持将依赖代码打包进单个文件里。如果需要生成包含所有依赖的单一静态库,你需要生成staticlib类型的库:
1. 调整库项目的Cargo.toml
在自定义库项目的Cargo.toml中,修改[lib]段的crate-type,添加staticlib类型(同时保留rlib不影响日常开发):
[lib] crate-type = ["staticlib", "rlib"]
2. 编译生成包含所有依赖的静态库
执行编译命令:
cargo build --lib # 若要生成发布版本,加--release参数 # cargo build --lib --release
编译完成后,在target/debug/(或target/release/)目录下会生成对应平台的静态库文件:
- Linux/macOS:
libmylib.a - Windows:
mylib.lib
这个文件包含了你的自定义库代码以及所有依赖的第三方crates代码。
3. 用rustc编译main.rs并链接静态库
使用生成的静态库编译你的main.rs,命令如下:
# Linux/macOS rustc main.rs -L ./target/debug/ -l mylib -o main # Windows rustc main.rs -L ./target/debug/ -l mylib -o main.exe
其中-L指定静态库的所在路径,-l mylib告诉rustc链接对应的静态库文件。
替代方案:保留rlib,编译时指定依赖搜索路径
如果不想生成静态库,只想继续使用rlib,可以在编译main.rs时,通过-L参数指定依赖crates的搜索路径:
rustc main.rs --extern mylib=./target/debug/libmylib.rlib -L ./target/debug/deps/
target/debug/deps/目录下存放着cargo build生成的所有依赖crates的rlib文件,rustc会在这里找到mylib依赖的xxx crate。
内容的提问来源于stack exchange,提问作者Abdutahir
相关产品推荐
相关产品推荐

