构建跨平台应用程序(使用Rust)

时间:2013-07-07 17:44:21

标签: cross-platform rust

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

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

那我该怎么办?

更新

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

4 个答案:

答案 0 :(得分:13)

要在多个平台上运行,您需要为@ 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内存,所以如果你遇到上面的问题,试试" make"代替。

在本机rustc build

中安装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库。上面有关如何执行此操作的说明,动态或静态地在单独的帖子中,但我已经使用了我的链接配额!

答案 1 :(得分:11)

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

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

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

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

相关问题