我开始学习 Rust 编程语言,并且使用 Linux。我想使用这种语言构建一个跨平台应用程序。
这个问题可能与 Rust 语言无关,但尽管如此,我该怎么做呢?我对构建“Hello World”跨平台应用程序以及更复杂的应用程序感兴趣。我只需要得到这个想法。
那我该怎么办?
更新:
我想要做的是能够在 3 个不同的平台上运行程序而不更改源。我是否必须从源代码为每个平台构建一个新的二进制文件?就像我在 C 中可以做的那样
要在多个平台上运行,您需要为每个平台构建一个可执行文件,如 @huon-dbauapp 评论的那样。
这对于 Rust 来说相当简单。您可以将“--target=”与 rustc 一起使用来告诉它您想要构建什么。相同的标志适用于 Cargo。
例如,这是针对 ARM 目标构建的:
cargo build --target=arm-unknown-linux-gnueabihf
有关目标的更多信息,请参阅 Rust 灵活目标规范。
但是,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
以下示例假设您已经安装了当前的 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”。
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),(..)
成功!!!:
$ scp hello me@arm:~
$ ssh me@arm ./hello
Hello, world!
我也用它来构建 Rust 项目并将其与单独的 C 库链接。与上面类似的关于如何动态或静态执行此操作的说明位于单独的帖子中,但我已经用完了我的链接配额!
解决这个问题的最佳方法是下载 Servo 的源代码并自行探索。 Servo 绝对是一个跨平台的代码库,因此它必须解决所有这些问题,无论它们是在构建/配置文件中还是 Rust 源本身中得到回答。
看起来 rust 编译器可能还没有准备好为 Windows 构建独立的二进制文件(请参阅此处的 Windows 部分),因此这可能还无法完成。
对于 posix 系统,它应该基本上可以工作,除非你试图做 GUI 的事情。
是的,您不需要更改源代码,除非您使用非跨平台的特定库。
但是正如 @dbaupp 所说,每个平台上的本机可执行文件都不同,*nix 使用 ELF、Windows PE 和 OSX Mach-O。因此,您需要为每个平台编译它。
我不知道 Rust 中交叉编译的状态,但是如果他们已经实现了它,那么您应该能够在同一平台上构建所有二进制文件,如果没有,您将必须在其平台上构建每个二进制文件.