Rust cargo.toml为C链接器和编译器指定自定义路径

问题描述 投票:1回答:1

由于我对货物设置的无知和大量的文档,我遇到了一些问题。

[cargo.toml文件是当前文件:

[package]
name = "hello"
version = "0.1.0"
authors = ["PC4\\Author"]

[dependencies]
sdl2 = { version = "0.34.1", features = ["bundled", "static-link"] }

已编译SDL2依赖关系,但实际上它使用的是Visual Studio。我真正想做的是在编译板条箱依赖项时使用另一个文件夹中的自定义编译器。

rust sdl-2 rust-cargo rust-crates
1个回答
0
投票

您可以在构建依赖项时指定rust以使用gcc编译器,只要您已为mingw正确安装了rust。为确保将锈迹正确配置为mingw,请使用this thread。请记住,默认情况下,Rust for Windows将配置为MSVC,而不是mingw。

以下步骤最初是在官方rust-sdl2 docs中提及的

完成后,您将需要一个构建脚本来将库链接到依赖项。但是首先,您需要这些库。从官方mingw]下载libsdl website特定库

现在您需要按照正确的顺序将这些文件与cargo.toml放在同一文件夹中-

SDL2-devel-2.0.x-mingw.tar.gz\SDL2-2.0.x\i686-w64-mingw32\bin       ->  gnu-mingw\dll\32
SDL2-devel-2.0.x-mingw.tar.gz\SDL2-2.0.x\x86_64-w64-mingw32\bin     ->  gnu-mingw\dll\64
SDL2-devel-2.0.x-mingw.tar.gz\SDL2-2.0.x\i686-w64-mingw32\lib       ->  gnu-mingw\lib\32
SDL2-devel-2.0.x-mingw.tar.gz\SDL2-2.0.x\x86_64-w64-mingw32\lib     ->  gnu-mingw\lib\64

[gnu-mingw应该是与cargo.toml相同目录的文件夹

现在您需要构建脚本本身,创建一个名为build.rs的文件,并将其放入[package]cargo.toml

build =“ build.rs”

有关构建脚本的更多信息,请参见here

这里是脚本-

use std::env;
use std::path::PathBuf;

fn main() {
    let target = env::var("TARGET").unwrap();
    if target.contains("pc-windows") {
        let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
        let mut lib_dir = manifest_dir.clone();
        let mut dll_dir = manifest_dir.clone();
        lib_dir.push("gnu-mingw");
        dll_dir.push("gnu-mingw");
        lib_dir.push("lib");
        dll_dir.push("dll");
        if target.contains("x86_64") {
            lib_dir.push("64");
            dll_dir.push("64");
        }
        else {
            lib_dir.push("32");
            dll_dir.push("32");
        }
        println!("cargo:rustc-link-search=all={}", lib_dir.display());
        for entry in std::fs::read_dir(dll_dir).expect("Can't read DLL dir")  {
            let entry_path = entry.expect("Invalid fs entry").path();
            let file_name_result = entry_path.file_name();
            let mut new_file_path = manifest_dir.clone();
            if let Some(file_name) = file_name_result {
                let file_name = file_name.to_str().unwrap();
                if file_name.ends_with(".dll") {
                    new_file_path.push(file_name);
                    std::fs::copy(&entry_path, new_file_path.as_path()).expect("Can't copy from DLL dir");
                }
            }
        }
    }
}

:这有意省略了MSVC特定的内容。

现在在[build]中的构建配置中也称为cargo.toml,您需要放置-

target =“ x86_64-pc-windows-gnu”

可在cargo build docs中找到可用目标的列表

有关构建配置的更多信息,请参见config docs

© www.soinside.com 2019 - 2024. All rights reserved.