【问题标题】:Building a cross-platform application (using Rust)构建跨平台应用程序(使用 Rust)
【发布时间】:2013-07-07 17:44:21
【问题描述】:

我开始学习 Rust 编程语言并使用 Linux。我想使用这种语言构建一个跨平台的应用程序。

这个问题可能与 Rust 语言无关,但是,我该怎么做呢?我对构建“Hello World”跨平台应用程序以及更复杂的应用程序感兴趣。我只需要了解一下。

那我该怎么办?

更新

我想做的是能够在 3 个不同平台上运行程序而不更改来源。我是否必须从源代码为每个平台构建一个新的二进制文件?就像我在 C 中可以做的那样

【问题讨论】:

  • 你能澄清你的问题吗?因为一个跨平台的 hello world 是:fn main() { println("Hello world!"); }(您想了解有关在不同平台上实际编译和分发二进制文件的信息吗?)
  • @dbaupp 我希望能够在所有 3-4 个主操作系统上启动“Hello World”。一旦编译——到处运行。
  • 啊,所以你想要一个可以在所有平台上运行的二进制文件?
  • 啊哈,好吧,Rust 是一种类似于 C 或 Go 的编译语言:它创建本地可执行文件,这些可执行文件特定于每个操作系统;不像 Java,它编译为针对 JVM 的字节码。所以,至少,你必须为每个平台编译一个二进制文件。
  • @dbaupp 我不熟悉跨平台开发。我想要做的是能够在 3 个不同平台上运行程序而不更改其源。我是否必须从源代码为每个平台构建一个新的二进制文件?就像我在 C 中可以做的那样。

标签: cross-platform rust


【解决方案1】:

如@huon-dbauapp 所说,要在多个平台上运行,您需要为每个平台构建一个可执行文件。

这对于 Rust 来说相当简单。你使用 "--target=" 和 rustc 来告诉它你想要构建什么。同样的标志也适用于 Cargo。

例如,这是为 ARM 目标构建的:

cargo build --target=arm-unknown-linux-gnueabihf

有关目标的更多信息,请参阅 Rust Flexible Target Specification

但是,Rust 不附带为 ARM 编译的 std Crate(截至 2015 年 6 月)。如果您的目标是这种情况,您首先需要自己为目标编译 std Crates,这涉及从源代码编译 Rust 编译器,并为该构建指定目标!

有关信息,大部分内容来自:https://github.com/japaric/ruststrap/blob/master/1-how-to-cross-compile.md

以下说明适用于 gcc,因此如果您没有此说明,则需要安装它。你还需要相应的交叉编译工具,所以对于 gcc:

sudo apt-get install gcc-arm-linux-gnueabihf

为 ARM 编译 Rust std Crate

以下示例假设您已经安装了当前的 Rust Nightly,因此我们将获取源代码并为 ARM 进行编译。如果您使用的是不同版本的编译器,则需要确保您的 ARM 库与您用于构建项目的编译器版本相匹配。

mkdir ~/toolchains
cd ~/toolchains
git clone https://github.com/rust-lang/rust.git
cd rust
git update

为 ARM 构建 rustc

cd ~/toolchains/rust
./configure --target=arm-unknown-linux-gnueabihf,x86_64-unknown-linux-gnu
make -j4
sudo make install

注意“-j4”至少需要 8GB RAM,所以如果遇到上述问题,请尝试“make”。

在原生 rustc 构建中安装 ARM rustc 库

sudo ln -s $HOME/src/rust/arm-unknown-linux-gnueabihf /usr/lib/rustlib/arm-unknown-linux-gnueabihf

创建 hello.rs 包含:

pub fn main() {
    println!("Hello, world!");
}

编译 hello.rs,并告诉 rustc 交叉编译器的名称(必须在您的 PATH 中):

rustc -C linker=arm-linux-gnueabihf-gcc-4.9 --target=arm-unknown-linux-gnueabihf hello.rs

检查生成的二进制文件是否真的是 ARM 二进制文件: $ file hello 你好:ELF 32 位 LSB 共享对象,ARM,EABI5 版本 1 (SYSV),(..)

成功!!!:

检查:二进制文件应该可以在 ARM 设备上运行

$ scp hello me@arm:~
$ ssh me@arm ./hello

Hello, world!

我也使用它来构建一个 Rust 项目并将其与一个单独的 C 库链接。与上述类似的关于如何动态或静态执行此操作的说明在单独的帖子中,但我已经用完了我的链接配额!

【讨论】:

    【解决方案2】:

    解决这个问题的最佳方法是下载Servo 的源代码并自行探索。 Servo 绝对是一个跨平台的代码库,因此它必须解决所有这些问题,无论是在构建/配置文件中还是在 Rust 源代码本身中都可以回答这些问题。

    【讨论】:

    • 这可能会占用我太多时间。我想我的问题可以得到更快的回答。
    【解决方案3】:

    看起来 rust 编译器可能还没有准备好为 windows 构建独立的二进制文件(请参阅 windows 部分 here),所以这可能还不能完成。

    对于 posix 系统,它应该主要是 Just Work,除非你尝试做 GUI 的东西。

    【讨论】:

      【解决方案4】:

      是的,您无需更改源代码,除非您使用非跨平台的特定库。

      但正如@dbaupp 所说,每个平台的本地可执行文件都不同,*nix 使用 ELF、Windows PE 和 OSX Mach-O。所以你需要为每个平台编译它。

      我不知道 rust 中交叉编译的状态,但如果他们已经实现了,那么你应该能够在同一个平台上构建所有二进制文件,如果没有,你将不得不在上面构建每个二进制文件这是平台。

      【讨论】:

        猜你喜欢
        • 2011-06-08
        • 1970-01-01
        • 1970-01-01
        • 2012-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-07
        • 2011-01-22
        相关资源
        最近更新 更多