如何让 Cargo 执行构建脚本并同时使用特定于目标的链接器?
Posted
技术标签:
【中文标题】如何让 Cargo 执行构建脚本并同时使用特定于目标的链接器?【英文标题】:How can I make Cargo execute a build script and use a target-specific linker at the same time? 【发布时间】:2017-05-18 01:46:40 【问题描述】:我正在调整一个用 Rust 编写的库的构建过程。目标是让它在带有 MSVCC 的 Windows 上编译。由于某些特定的依赖关系,我必须确保使用了正确的 MSVCC 链接器,因此我为 Cargo 设置了一个特定于项目的配置文件:
[target.x86_64-pc-windows-msvc]
linker = "C:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/bin/amd64/link.exe"
当我现在运行cargo build
时,我的构建脚本build.rs
不再执行。由于脚本提供了重要库的路径,因此构建过程最终会失败。
若要在 Windows 10(64 位)下使用 Visual Studio 12 重现该问题,请按如下方式创建项目:
| build.rs
| Cargo.toml
|
+---.cargo
| config
|
\---src
main.rs
./build.rs:
use std::env;
fn main()
let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
panic!("Building!");
./Cargo.toml:
[package]
name = "some_binary"
version = "0.1.0"
build = "build.rs"
.cargo/config:
[target.x86_64-pc-windows-msvc]
linker = "C:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/bin/amd64/link.exe"
src/main.rs:
fn main()
println!("Hello, world!");
当您调用 cargo build
时,链接应该会失败并显示
LINK:致命错误 LNK1181:无法打开输入文件 'advapi32.lib'
【问题讨论】:
【参考方案1】:更新:
目前,当明确指定 VS 链接器时,Rust 的稳定版本无法包含正确的库(即 Windows SDK)。因此,构建脚本无法链接,构建失败。
解决方案:
nightly 最近的变化已经解决了这个问题。只需切换到 nightly 或等到它合并到稳定版本。
【讨论】:
以上是关于如何让 Cargo 执行构建脚本并同时使用特定于目标的链接器?的主要内容,如果未能解决你的问题,请参考以下文章