22

Rust プログラミング言語を学び始め、Linux を使用しています。この言語を使用してクロスプラットフォーム アプリケーションを構築したいと考えています。

質問は特に Rust 言語に関連していないかもしれませんが、それにもかかわらず、どうすればよいでしょうか? 「Hello World」クロスプラットフォーム アプリケーションと、より複雑なアプリケーションの構築に興味があります。私はただアイデアを得る必要があります。

それで、私は何をしますか?

更新

私がやりたいことは、ソースを変更せずに 3 つの異なるプラットフォームでプログラムを実行できるようにすることです。ソースからプラットフォームごとに新しいバイナリ ファイルを作成する必要がありますか? Cでできるのと同じように

4

4 に答える 4

16

複数のプラットフォームで実行するには、@huon-dbauapp がコメントしたように、それぞれの実行可能ファイルをビルドする必要があります。

これはRustではかなり簡単です。何をビルドしたいかをrustcに伝えるために"--target="を使用します。Cargo でも同じフラグが機能します。

たとえば、これは ARM ターゲット用にビルドします。

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

ターゲットの詳細については、Rustフレキシブル ターゲット仕様を参照してください。

ただし、Rust には ARM 用にコンパイルされた std Crate が同梱されていません (2015 年 6 月現在)。これがあなたのターゲットの場合、最初にターゲット用の std クレートを自分でコンパイルする必要があります。これには、ソースから 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 クレートを 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

「-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 にクロスコンパイラの名前を伝えます (パスにある必要があります):

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)、(..)

成功!!!:

チェック: バイナリは ARM デバイスで動作するはずです

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

Hello, world!

これを使用して、Rust プロジェクトをビルドし、別の C ライブラリにもリンクしました。動的または静的にこれを行う方法に関する上記と同様の手順は別の投稿にありますが、リンクのクォータをすでに使い切ってしまいました!

于 2015-06-20T22:23:09.580 に答える
11

これを理解する最善の方法は、 Servoのソース コードをダウンロードして、自分で調べてみることです。Servo は完全にクロスプラットフォームのコードベースであるため、ビルド/構成ファイルで回答するか、Rust ソース自体で回答するかにかかわらず、これらすべての質問に対処する必要があります。

于 2013-07-07T17:47:07.140 に答える
3

Rust コンパイラはまだ Windows 用のスタンドアロン バイナリをビルドする準備ができていないようです (こちらの Windows セクションを参照)。

posix システムの場合、GUI を実行しようとしている場合を除き、ほとんどの場合は動作するはずです。

于 2013-07-08T23:14:03.277 に答える
2

はい、クロスプラットフォームではない特定のライブラリを使用していない限り、ソースを変更する必要はありません。

しかし、@dbaupp が言ったように、ネイティブ実行可能ファイルはプラットフォームごとに異なり、*nix は ELF、Windows PE、および OSX Mach-O を使用します。したがって、プラットフォームごとにコンパイルする必要があります。

Rust でのクロスコンパイルの状態はわかりませんが、すでに実装されている場合は、同じプラットフォームですべてのバイナリをビルドできるはずです。そうでない場合は、そのプラットフォームで各バイナリをビルドする必要があります。

于 2013-07-09T07:39:31.347 に答える