这个问题可能与Rust语言本身无关,但无论如何,我该如何做到这一点呢?我对构建一个“Hello World”跨平台应用程序以及更复杂的应用程序都很感兴趣。我只是需要一个思路。
那么我该怎么做呢?
更新:
我想要的是在不改变源代码的情况下,在3个不同的平台上运行程序的能力。我是否需要从源代码构建每个平台的新二进制文件呢?就像在C语言中可以做的那样。
要在多个平台上运行,您需要为每个平台构建一个可执行文件,如@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
以下示例假定您已安装了当前的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
hello:ELF 32位LSB共享对象,ARM,EABI5版本1(SYSV),(..)
SUCCESS!!!:
$ 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中交叉编译的状态,但如果他们已经实现了它,那么你应该能够在同一平台上构建所有二进制文件,如果没有,你将不得不在其平台上构建每个二进制文件。
fn main() { println("Hello world!"); }
(你想要关于如何在不同平台上实际编译和分发二进制文件的信息吗?) - huon