如何让Cargo在stdlib之后链接libbsd库以解决链接错误?
解决嵌入式Rust测试中libbsd链接顺序问题
核心问题是链接器按顺序解析符号:libstd测试代码依赖libbsd提供的poll实现,但-lbsd被放在libstd之前时,链接器处理libbsd还没看到libstd的未定义引用,导致符号解析失败;把-lbsd放在链接命令末尾则能正常解析。
下面是几种可行的解决方法:
方案1:在build.rs中传递链接器参数
直接告诉cargo把-lbsd作为链接器参数放在命令末尾,修改build.rs添加:
println!("cargo:rustc-link-arg=-lbsd");
这种方式会让-lbsd始终出现在链接命令的最后,确保在libstd之后被处理。
方案2:通过RUSTFLAGS临时指定链接参数
运行测试时直接传递链接器参数:
RUSTFLAGS='-C link-arg=-lbsd' cargo test
-C link-arg会将后续参数直接传给链接器,且默认放在命令行末尾,刚好满足顺序要求。
方案3:全局配置永久生效
如果这个目标平台是你常用的,可以在~/.cargo/config.toml中添加目标专属配置:
[target.你的目标平台三元组] rustflags = ["-C", "link-arg=-lbsd"]
替换你的目标平台三元组为实际值(比如armv7-unknown-linux-musleabihf),之后针对该目标的所有构建都会自动应用这个链接参数。
关于-Z build-std可行的原因
你发现用RUSTFLAGS=-lbsd加cargo test -Z build-std=std,panic_abort能正常工作,是因为重建libstd时,-lbsd会被链接到libstd本身——此时libstd已经包含了poll的实现,后续测试二进制链接时就不存在顺序依赖问题了。
内容的提问来源于stack exchange,提问作者the_summer
相关产品推荐
相关产品推荐

