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

gab6jxml  于 2023-11-19  发布在  其他
关注(0)|答案(4)|浏览(110)

我开始学习Rust编程语言,我使用Linux。我想使用这种语言构建一个跨平台应用程序。
这个问题可能与Rust语言没有特别的关系,但无论如何,我该怎么做呢?我对构建一个“Hello World”跨平台应用程序以及更复杂的应用程序很感兴趣。我只需要得到这个想法。
我该怎么办?

更新

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

mrphzbgm

mrphzbgm1#

要在多个平台上运行,你需要为每个平台构建一个可执行文件,@huon-dbauapp评论道。
这在Rust中非常简单。您可以使用“--target=”与rustc一起告诉它您想要构建什么。相同的标志适用于Cargo。
例如,这是为ARM目标构建的:
第一个月
有关目标的更多信息,请参阅Rust Flexible Target Specification
然而,Rust不附带为ARM编译的std Crate(截至2015年6月)。如果您的目标是这种情况,您首先需要自己为目标编译std Crate,这涉及到从源代码编译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 std Crate For ARM

下面的例子假设你已经安装了当前的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


注意“-j 4”至少需要8 GB RAM,所以如果你遇到上面的问题,请尝试“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,EABI 5版本1(SYSV),(..)
成功!:

检查:二进制文件应该在ARM设备上工作

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

Hello, world!


我已经用它来构建和链接一个Rust项目与一个单独的C库。类似于上面关于如何动态或静态地做这件事的说明在一个单独的帖子中,但我已经用完了我的链接配额!

rkue9o1l

rkue9o1l2#

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

kiz8lqtg

kiz8lqtg3#

看起来rust编译器可能还没有准备好为windows构建独立的二进制文件(参见windows部分here),所以这可能还不能完成。
对于posix系统,它应该主要只是工作,除非你试图做GUI的东西。

wh6knrhe

wh6knrhe4#

是的,您不需要更改源代码,除非您使用的是非跨平台的特定库。
但是正如@dbaupp所说,每个平台上的本地可执行文件都是不同的,*nix使用ELF、Windows PE和OSX Mach-O。
我不知道rust中交叉编译的状态,但如果他们已经实现了它,那么你应该能够在同一个平台上构建所有的二进制文件,如果不是,你将不得不在它的平台上构建每个二进制文件。

相关问题