如何让 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 执行构建脚本并同时使用特定于目标的链接器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在构建脚本中指定链接器标志/参数?

如何将特定于构建的配置注入 APK?

Rails 3.1 资产管道:如何加载特定于控制器的脚本?

尝试运行特定于平台的构建时 Automake 失败

Webpack 中特定于页面的 JavaScript 以及第三方脚本和应用程序范围的脚本

Xcode:构建特定于每个文件编译器构建设置的体系结构