當Rust程式開發完成,要進入部署階段的時候,開發時用的系統環境和投入使用時用的系統環境不一定會相同,例如用x86_64桌上型電腦和Linux作業系統開發ARM64樹莓派上的程式,在部署的時候我們就需要針對樹莓派所使用的CPU架構和作業系統來做程式的重新編譯,否則如果直接將x86_64桌上型電腦的Linux作業系統下編譯出來的程式,放到ARM64樹莓派內的話,就算都是使用Linux作業系統,程式也還是無法執行的。但是如果我們真的要將Rust的程式專案放進樹莓派來編譯的話,那肯定是很花時間的!所以有沒有什麼方式是可以在原本的開發環境中,針對不同的系統環境來編譯出程式呢?



有的!那就是「交叉編譯(cross compile)」。藉由設定編譯時所使用的工具鏈(toolchain),我們可以讓Rust在同樣的系統環境下編譯出不同系統環境的程式。然而,要實現系統原生程式的交叉編譯不是一件簡單的事情,因其會受到專利、技術、著作權、平台相依等等的限制,在實務上並不是所有的程式都可以成功被交叉編譯!

Rust提供多種工具鏈可以使用,純粹的Rust程式碼可以很容易地實現交叉編譯,但如果Rust程式有使用到C/C++函式庫,情況就會變得複雜許多。

cross

cross是一個Rust交叉編譯的程式專案,利用Docker簡化了在x86_64的Linux作業系統上進行交叉編譯時所需進行的前置設定。提供多種常見CPU架構和部份作業系統的交叉編譯環境(Docker映像檔),除了Rust程式碼能夠交叉編譯外,因為有包含C/C++編譯器,所以C/C++的程式碼也是可以跟著一起進行交叉編譯的。

GitHub:

https://github.com/rust-embedded/cross

在開始使用cross工具前,除了Rust開發環境要先安裝好之外,Docker服務也要安裝啟用,並且還要將Linux使用者加入至「docker」群組中。

輸入以下指令,直接使用Cargo來安裝cross工具:

cargo install cross

rust-cross-compile

安裝好後,如果需要進行交叉編譯,就可以用「cross build」、「cross check」、「cross run」和「cross test」指令來取代「cargo build」、「cargo check」、「cargo run」和「cargo test」,再藉由傳入「--target」參數來決定要交叉編譯成哪個系統環境的程式。

例如,若要在Linux作業系統上交叉編譯出64位元的Windows x86程式,「target」可以設為「x86_64-unknown-linux-gnu」。建置Cargo程式專案的指令如下:

cross build --target x86_64-unknown-linux-gnu

再舉一個例子,若要在Linux作業系統上交叉編譯出64位元的Linux ARM程式,「target」可以設為「aarch64-unknown-linux-gnu」。建置Cargo程式專案的指令如下:

cross build --target aarch64-unknown-linux-gnu

rust-cross-compile