關於交叉編譯
一般編程階段用的是Windows或者Mac系統,部署平台是Linux,這種情況下就需要使用Cross-Compiler交叉編譯,意思是可以在當前平台Host下編譯出目標平台target的可執行文件,
尤其是做ARM平台開發的同學對這個更為熟悉。
Rust交叉編譯在Github上有一個文檔Rust核心員工Jorge Aparicio
提供的一份文檔https://github.com/japaric/rust-cross,推薦大家仔細的讀一讀。
如果要求比較簡單,都是X86_64
架構,從Mac
上編譯出unknow-linux/pc-windows-gnu
就好。
musl工具鏈(編譯Linux環境程序所需)
musl實現了Linux libc
,質量可靠,適配所有Linux環境,使用靜態連接替換動態鏈接,這樣就能打出一個完整的二進制文件,可以丟到任何Linux環境里運行。
當然,關於靜態鏈接與動態鏈接各有優缺點,這里不細說。
安裝一下
rustup target add x86_64-unknown-linux-musl
安裝musl-cross
brew install filosottile/musl-cross/musl-cross
windows-gnu相關(編譯Windows環境程序所需)
安裝windows-gnu,
用msvc容易編譯失敗,msvc其實就是指編譯出來的程序直接依賴Windows平台的基礎庫,而gnu的則是開源的基礎庫直接內嵌到咱們編譯的程序里,所以msvc的程序要更小。
rustup target add x86_64-pc-windows-gnu
安裝mingw-w64
brew install mingw-w64
Rust程序示例
main.rs
fn main() { println!("Hello, world!\r\nwww.qttc.net\r\n"); }
配置和打包編譯
配置config
vi ~/.cargo/config(沒有新建即可,另外可在項目根目錄下創建.cargo/config文件,只對當前項目生效)
內容如下:
[target.x86_64-unknown-linux-musl] linker = "x86_64-linux-musl-gcc" [target.x86_64-pc-windows-gnu] linker = "x86_64-w64-mingw32-gcc" ar = "x86_64-w64-mingw32-gcc-ar"
編譯(Linux環境程序)
cargo build --release --target x86_64-unknown-linux-musl
可把編譯命令寫到腳本中:
編譯命令整理為sh可執行文件腳本(package_linux.sh,放在項目根目錄,給與執行權限chmod +x package_linux.sh)如下:
if [[ $(echo $0 | awk '/^\//') == $0 ]]; then ABSPATH=$(dirname $0) else ABSPATH=$PWD/$(dirname $0) fi cd ${ABSPATH} cargo build --release --target x86_64-unknown-linux-musl
編譯出來后在target里會有個x86_64-unknown-linux-musl目錄,里面又根據--release有debug和release目錄,其中名為項目名的文件就是打包出來的Linux環境程序軟件。
編譯(Windows環境程序)
cargo build --release --target x86_64-pc-windows-gnu
也可把編譯命令寫到腳本中:
編譯命令整理為sh可執行文件腳本(package_win.sh,放在項目根目錄,給與執行權限chmod +x package_win.sh)如下:
if [[ $(echo $0 | awk '/^\//') == $0 ]]; then ABSPATH=$(dirname $0) else ABSPATH=$PWD/$(dirname $0) fi cd ${ABSPATH} cargo build --release --target x86_64-pc-windows-gnu
編譯出來后在target里會有個x86_64-pc-windows-gnu目錄,里面又根據--release有debug和release目錄,其中xxx.exe為打包出來的Windows環境程序軟件。
參考:
1. https://www.qttc.net/529-rust-cross-compile-mac-to-linux.html
2. https://www.cnblogs.com/silentdoer/p/13024037.html
3. https://blog.csdn.net/weixin_32827751/article/details/113998427