将Rust应用程序从Linux交叉编译到Windows

Fed*_*omp 34 linux windows cross-compiling rust

基本上我正在尝试将最简单的代码编译到Windows,而我正在Linux上进行开发.

fn main() {
    println!("Hello, and bye.")
}
Run Code Online (Sandbox Code Playgroud)

我通过搜索互联网找到了这些命令:

rustc --target=i686-w64-mingw32-gcc  main.rs
rustc --target=i686_pc_windows_gnu -C linker=i686-w64-mingw32-gcc  main.rs
Run Code Online (Sandbox Code Playgroud)

可悲的是,他们都没有工作.它给我一个关于std crate丢失的错误

$ rustc --target=i686_pc_windows_gnu -C linker=i686-w64-mingw32-gcc  main.rs 

main.rs:1:1: 1:1 error: can't find crate for `std`
main.rs:1 fn main() {
          ^
error: aborting due to previous error
Run Code Online (Sandbox Code Playgroud)

有没有办法在Linux上编译将在Windows上运行的代码?

zee*_*zee 80

其他答案虽然在技术上是正确的,但比他们需要的要困难得多。有没有必要使用rustc(其实它气馁,只是用cargo),你只需要rustupcargo你的发行版的的MinGW-W64。

添加目标(您也可以为交叉编译的任何目标更改此设置):

rustup target add x86_64-pc-windows-gnu
rustup toolchain install stable-x86_64-pc-windows-gnu
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法轻松构建您的板条箱:

cargo build --target x86_64-pc-windows-gnu
Run Code Online (Sandbox Code Playgroud)

无需乱搞~/.cargo/config或其他任何东西。

编辑:只是想补充一点,虽然您可以使用上述内容,但有时也会令人头疼。我想补充一点,Rust 工具团队还维护一个名为 cross 的项目:https : //github.com/rust-embedded/cross 这可能是您想要研究的另一个解决方案

  • 是否需要“rustup toolchain install stable-x86_64-pc-windows-gnu”?它打印了消息“警告:工具链‘stable-x86_64-pc-windows-gnu’可能无法在此系统上运行。” 和“警告:如果您打算构建针对该平台的软件,也许可以尝试使用 `rustup target add x86_64-pc-windows-gnu` 来代替?” 另外,如果我卸载工具链,交叉编译仍然可以正常工作。 (15认同)
  • 但 Cargo 失败并显示“错误:未找到链接器 x86_64-w64-mingw32-gcc”。我猜您的说明中缺少一些步骤? (3认同)
  • 在 Debian 上,还需要“sudo apt-get install mingw-w64”。否则,工作得很好。 (2认同)

Fra*_*gné 29

Rust发行版仅为主机系统提供编译库.但是,根据Arch Linux上关于Rust的wiki页面,您可以在下载目录中的Windows软件包中复制已编译的库(请注意,有i686和x86-64软件包)在系统的适当位置(在/usr/lib/rustlib或中/usr/local/lib/rustlib,取决于安装了Rust的地方),安装mingw-w64-gcc和Wine,你应该能够交叉编译.

如果您正在使用Cargo,您可以ar通过将其添加到~/.cargo/config($ARCH您使用的架构在哪里)来告诉Cargo在哪里查找和链接器:

[target.$ARCH-pc-windows-gnu]
linker = "/usr/bin/$ARCH-w64-mingw32-gcc"
ar = "/usr/$ARCH-w64-mingw32/bin/ar"
Run Code Online (Sandbox Code Playgroud)

注意:确切路径可能因您的分布而异.检查发行版中mingw-w64软件包(GCC和binutils)的文件列表.

然后你就可以像这样使用Cargo:

$ # Build
$ cargo build --release --target "$ARCH-pc-windows-gnu"
$ # Run unit tests under wine
$ cargo test --target "$ARCH-pc-windows-gnu"
Run Code Online (Sandbox Code Playgroud)

  • 尝试明确地链接到`libgcc_s.a`(当然是Windows的). (2认同)

rof*_*rol 15

让我们从Ubuntu到Windows x86_64的rust-sdl2项目交叉编译示例

~/.cargo/config

     Running `rustc --crate-name animation examples/animation.rs --color always --crate-type bin --emit=dep-info,link -C debuginfo=2 --cfg 'feature="default"' -C metadata=006e668c6384c29b -C extra-filename=-006e668c6384c29b --out-dir /home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/examples --target x86_64-pc-windows-gnu -C ar=x86_64-w64-mingw32-gcc-ar -C linker=x86_64-w64-mingw32-gcc -C incremental=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/incremental -L dependency=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/deps -L dependency=/home/roman/projects/rust-sdl2/target/debug/deps --extern bitflags=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/deps/libbitflags-2c7b3e3d10e1e0dd.rlib --extern lazy_static=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/deps/liblazy_static-a80335916d5ac241.rlib --extern libc=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/deps/liblibc-387157ce7a56c1ec.rlib --extern num=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/deps/libnum-18ac2d75a7462b42.rlib --extern rand=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/deps/librand-7cf254de4aeeab70.rlib --extern sdl2=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/deps/libsdl2-3f37ebe30a087396.rlib --extern sdl2_sys=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/deps/libsdl2_sys-3edefe52781ad7ef.rlib -L native=/home/roman/.cargo/registry/src/github.com-1ecc6299db9ec823/winapi-x86_64-pc-windows-gnu-0.4.0/lib`
error: linking with `x86_64-w64-mingw32-gcc` failed: exit code: 1
Run Code Online (Sandbox Code Playgroud)

然后运行:

[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"
ar = "x86_64-w64-mingw32-gcc-ar"
Run Code Online (Sandbox Code Playgroud)

cargo build 将二进制文件放入 target/x86_64-pc-windows-gnu/debug/examples/

复制所需文件:

sudo apt-get install gcc-mingw-w64-x86-64 -y
# use rustup to add target https://github.com/rust-lang/rustup.rs#cross-compilation
rustup target add x86_64-pc-windows-gnu

# Based on instructions from https://github.com/AngryLawyer/rust-sdl2/

# First we need sdl2 libs
# links to packages https://www.libsdl.org/download-2.0.php

sudo apt-get install libsdl2-dev -y
curl -s https://www.libsdl.org/release/SDL2-devel-2.0.9-mingw.tar.gz | tar xvz -C /tmp

# Prepare files for building

mkdir -p ~/projects
cd ~/projects
git clone https://github.com/Rust-SDL2/rust-sdl2
cd rust-sdl2
cp -r /tmp/SDL2-2.0.9/x86_64-w64-mingw32/lib/* ~/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-gnu/lib/
cp /tmp/SDL2-2.0.9/x86_64-w64-mingw32/bin/SDL2.dll .
Run Code Online (Sandbox Code Playgroud)

然后将目录复制target/x86_64-pc-windows-gnu/debug/examples/到Windows计算机并运行exe文件.

在cmd.exe中运行

如果要在运行exe文件时查看控制台输出,可以从中运行它们cmd.exe.

cmd.exe在文件资源管理器中的当前目录中打开,右键单击窗口中的空白位置并选择Open command window here.

mingw没有回溯 - 使用msvc

与此同时,如果你想要回溯并且不介意安装VC++,你可以随时使用x86_64-pc-windows-msvc版本的Rust.

https://github.com/rust-lang/rust/issues/33985#issuecomment-222826116


ras*_*spi 10

有一种基于Docker的解决方案,称为cross。所有必需的工具都在虚拟化环境中,因此您无需为您的机器安装额外的软件包。请参阅支持的目标列表

来自项目的自述文件:

特征

  • cross 将提供交叉编译所需的所有成分,而无需触及您的系统安装。
  • cross 提供了一个环境、交叉工具链和交叉编译的库,可以生成最便携的二进制文件。
  • “交叉测试”,cross可以测试除 i686 和 x86_64 以外的架构的 crate。
  • 支持稳定版、测试版和夜间频道。

依赖关系

  • rustup
  • binfmt_misc交叉测试需要支持的 Linux 内核。

需要这些容器引擎之一。如果两者都安装,cross将默认为 docker。

  • 码头工人。请注意,在 Linux 上,非 sudo 用户需要在docker组中。阅读官方安装后步骤。需要 1.24 或更高版本。
  • 波德曼。需要 1.6.3 或更高版本。

安装

$ cargo install cross
Run Code Online (Sandbox Code Playgroud)

用法

cross 具有与 Cargo 完全相同的 CLI,但由于它依赖于 Docker,因此您必须先启动守护程序,然后才能使用它。

# (ONCE PER BOOT)
# Start the Docker daemon, if it's not already running
$ sudo systemctl start docker

# MAGIC! This Just Works
$ cross build --target aarch64-unknown-linux-gnu

# EVEN MORE MAGICAL! This also Just Works
$ cross test --target mips64-unknown-linux-gnuabi64

# Obviously, this also Just Works
$ cross rustc --target powerpc-unknown-linux-gnu --release -- -C lto
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢这个解决方案!我在从 Windows 到 Raspberry Pi 的交叉编译中遇到问题,“找不到 crate 'std' ...'arm-unknown-linux-gnueabihf' 目标可能未安装”,即使在确认我已经安装了目标之后也是如此`生锈`。这是迄今为止唯一对我有用的解决方案。 (2认同)

RAX*_*RAX 10

对我有用的解决方案是。它类似于已接受的答案之一,但我不需要添加工具链。

rustup target add x86_64-pc-windows-gnu
cargo build --target x86_64-pc-windows-gnu
Run Code Online (Sandbox Code Playgroud)

请参阅文档了解更多详细信息。