构建一个跨架构应用程序(使用Rust)

24
我开始学习Rust编程语言,并且我使用Linux。我想用这种语言构建一个跨平台应用程序。
这个问题可能与Rust语言本身无关,但无论如何,我该如何做到这一点呢?我对构建一个“Hello World”跨平台应用程序以及更复杂的应用程序都很感兴趣。我只是需要一个思路。
那么我该怎么做呢?
更新:
我想要的是在不改变源代码的情况下,在3个不同的平台上运行程序的能力。我是否需要从源代码构建每个平台的新二进制文件呢?就像在C语言中可以做的那样。

你能澄清一下你的问题吗?因为一个跨平台的hello world程序是:fn main() { println("Hello world!"); }(你想要关于如何在不同平台上实际编译和分发二进制文件的信息吗?) - huon
@dbaupp,我想要在所有3-4个主要的操作系统上都能启动“Hello World”。一旦编译完毕,随处运行。 - user266003
啊,所以你想要一个可以在所有平台上运行的单一二进制文件? - huon
5
Rust是一种类似于C或Go的编译语言:它创建本地可执行文件,对每个操作系统都是特定的。与Java不同,Java会将代码编译为针对JVM的字节码。因此,至少需要为每个平台编译一个二进制文件。 - huon
@dbaupp 我不熟悉跨平台开发。我想做的是能够在三个不同的平台上运行程序,而不需要更改其源代码。我是否需要从源代码构建每个平台的新二进制文件?就像我可以在C语言中做的那样。 - user266003
由于这个问题是关于架构而不是平台的,我将修正标题。平台将是Windows/OSX。 - undefined
4个回答

20

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

使用Rust相当简单。您可以使用rustc的"--target="告诉它您想要构建什么。同样的标志也适用于Cargo。

例如,这将为ARM目标构建:

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

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

但是,Rust不会随附已针对ARM编译的std包(截至2015年6月)。如果这是您的目标情况,则您首先需要为目标编译std包,这涉及从源代码编译Rust编译器,并指定该版本的目标!

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

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

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

为ARM编译Rust std包

以下示例假定您已安装了当前的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 hello:ELF 32位LSB共享对象,ARM,EABI5版本1(SYSV),(..)

SUCCESS!!!:

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

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

Hello, world!

我曾使用这种方法来构建并链接一个Rust项目与一个单独的C库。如何动态或静态地执行此操作的说明类似于上面的内容,但是我已经用完了我的链接配额!


10

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


17
可能会花费我太多时间。我猜我的问题可以更快得到回答。 - user266003

3

看起来 Rust 编译器可能还没有准备好为 Windows 构建独立的二进制文件,详见这里的 Windows 部分。因此,目前可能还无法实现。

对于 POSIX 系统,除非你正在尝试做 GUI 相关的工作,否则它应该基本可以正常工作。


3

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接