Rust同项目下staticlib库的二进制文件无法引用库函数如何解决
你的问题核心是[lib]的crate-type配置不符合同项目二进制引用的要求,Rust仅会自动将rlib类型的库作为同项目二进制的依赖,你目前只配置了staticlib,所以二进制完全感知不到同项目的库存在。
修复步骤
步骤1:修改Cargo.toml配置
[package] name = "myos" version = "0.1.0" edition = "2018" [lib] # 同时保留rlib供同项目二进制引用,staticlib供你外部链接使用 crate-type = ["staticlib", "rlib"] # 放开bin配置,指定feature控制编译 [[bin]] name = "main" required-features = ["bootloader"] [dependencies.bootloader] version = "0.10" optional = true [profile.dev] panic = "abort" [profile.release] panic = "abort" [features] default = ["bootloader"]
步骤2:调整文件路径
把src/main.rs移动到src/bin/main.rs,符合Cargo默认的二进制文件存放规范。
步骤3:修正main.rs的引用逻辑
#![no_std] #![no_main] // 直接引用同项目库的导出内容 use myos::{kernel_early, main, myos_panic}; #[no_mangle] pub extern "C" fn _start() -> ! { kernel_early(); main(); loop {} } use core::panic::PanicInfo; #[panic_handler] fn panic(info: &PanicInfo<'_>) -> ! { // myos_panic是库crate的导出函数,需要加myos前缀 myos_panic(info); }
验证效果
- 执行
cargo build --features bootloader:会同时编译静态库和main二进制,无引用报错 - 执行
cargo build --no-default-features:仅编译静态库,不会编译main二进制,符合你自行链接的需求
内容的提问来源于stack exchange,提问作者VP.
相关产品推荐
相关产品推荐

