web-dev-qa-db-ja.com

クロスプラットフォームアプリケーションの構築(Rustを使用)

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

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

だから私は何をしますか?

[〜#〜] update [〜#〜]

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

20
user266003

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

11
crowder

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

これはRustではかなり簡単です。 rustcで「--target =」を使用して、何をビルドするかを指示します。同じフラグがCargoでも機能します。

たとえば、これはARMターゲット:

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

ターゲットの詳細については、Rust Flexible Target Specification )を参照してください。

ただし、Rustは、ARM(2015年6月現在)用にコンパイルされたstd Crateには付属していません。これがターゲットに当てはまる場合は、まず、ターゲットの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 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」を試してください。

インストールARM rustcライブラリネイティブ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をコンパイルし、クロスコンパイラーの名前(PATHに含まれている必要があります)を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ライブラリにビルドしてリンクしました。これを動的または静的に行う方法に関する上記と同様の手順は別の投稿にありますが、リンククォータを使い切ってしまいました!

13
theWebalyst

RustコンパイラはまだWindows用のスタンドアロンバイナリを構築する準備ができていないようです(Windowsセクション ここ を参照)ので、これはおそらくまだ行うことができません。

Posixシステムの場合、GUIを実行しようとしているのでない限り、ほとんどの場合は正常に機能するはずです。

3
tehgeekmeister

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

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

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

2
snf