M1 MacでRustの環境

動かすのはラズパイでIoT的な物にしたいが、まずはMacで開始します。

Rust関連のインストール(やり方は公式ページなど参照)、

% rustc --version
rustc 1.71.0 (8ede3aae2 2023-07-12)

% cargo version
cargo 1.71.0 (cfd3bbd8f 2023-06-08)

% rustup --version	// Rust tool chain, cargo(Rust's package manager)とは併用
rustup 1.26.0 (5af9b9484 2023-04-05)

cargo-editはcargoの拡張機能、単独のコマンドではない
% cargo install cargo-edit

% cargo install cross

クロス環境用にcrossをインストールしますが。本来的にはcargoはRustのパッケージ管理とビルドツール。crossはクロスコンパイル環境ですが、実はcrossはDockerにターゲットDockerイメージを展開してコンパイルするようになっています。

Intel Mac用のコンパイル(cargo build)と実行(cargo run)

コードは、

https://isehara-3lv.sakura.ne.jp/blog/2023/01/19/rustの基本的なsyntax/

% cargo run --target x86_64-apple-darwin     

    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/x86_64-apple-darwin/debug/rust`
i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10

内部的にはRosetta2使っているだろうから、Intel用のバイナリでもそのまま実行できます。もちろん実行ファイルを直接呼び出して

% ./target/x86_64-apple-darwin/debug/rust 

も結果は同じ。Intel Macに転送して実行してもきちんと実行できました。

 

P.S. ラズパイ用のクロスコンパイルはエラーになる、追加の設定(Linker設定してないから)が要りそう。ネットの情報は古くてあまり参考になるものは少ない。

% cargo build --target thumbv6m-none-eabi    
   Compiling rust v0.1.0 (/Users/usamiryuuichi/rust)
error[E0463]: can't find crate for `std`

~~以下省略~~

 

admin

ラズパイでRust

を今年の後半はRustの勉強兼ねて使ってみようと思う。GPIOなどの固有ハードウェア操作用の基本的なライブラリはすでに存在するだろうから。

https://misoji-engineer.com/archives/rust-led.html

クロス開発環境はDocker(GolangのネーティブC環境の必要性と同じく)になるのかそれともGolangと同じようにターゲット指定で済むのか、その前にRustの基本的な部分の習得が先ですが。

https://isehara-3lv.sakura.ne.jp/blog/category/rust/

はPlayground使って初めてのRustですが、オンラインの学習用には、

https://doc.rust-jp.rs/book-ja/title-page.html

あたりが適切のように思う。

 

P.S. (2023/8/2)

クロスコンパイルはcrossツールを使いますが、実はDockerの中にターゲットのイメージを展開して実行されます。従って賢いやり方ですね、Golangと比べても。

 

admin

Rustの基本的なsyntax

初めてRustをPlaygroungで動かしてみたけど、結構独特だと思う

https://www.rust-lang.org

“for” loopはイテレータ専用

“The for in construct can be used to iterate through an Iterator. “

通常のループ処理は無限ループ使ってcontinuebreakで条件判断

<初めてのRustのコード>

fn main() {
    let mut i = 0;
    loop {
        println!("i = {}", i);
        if i == 10{
            break i;
        }
        i += 1;
    };
}

・mutable変数はmutで宣言が必要、宣言しないとimmutable変数になる

・println!では必ずプレースホルダー”{}”を入れる

loop}にも;が必要、if{}}の後ろにはあっても無くてもコンパイルエラーにはならないけれども

・ifの条件をカッコ()で括らないのはGoと同じ

 

admin