交叉編譯¶
Crystal 支援基本形式的 交叉編譯。
為了達成此目的,編譯器執行檔提供了兩個標誌:
--cross-compile
:啟用交叉編譯模式時給定。--target
:要使用的 LLVM 目標三元組,並從中設定預設的編譯時標誌。
要取得 --target
標誌,您可以使用目標系統上已安裝的 LLVM 執行 llvm-config --host-target
。例如,在 Linux 上它可能會顯示「x86_64-unknown-linux-gnu」。
如果您需要設定任何未透過 --target
隱含設定的編譯時標誌,您可以使用 -D
命令列標誌。
使用這兩個標誌,我們可以在 Mac 上編譯一個程式,使其像這樣在 Linux 上執行:
crystal build your_program.cr --cross-compile --target "x86_64-unknown-linux-gnu"
這將產生一個 .o
(物件檔案) 並印出一行,其中包含要在我們嘗試交叉編譯到的系統上執行的指令。例如:
cc your_program.o -o your_program -lpcre -lrt -lm -lgc -lunwind
您必須將此 .o
檔案複製到該系統並執行這些指令。完成後,執行檔將在該目標系統上可用。
此程序通常與編譯器本身一起執行,以將其移植到尚未提供編譯器的新平台上。因為為了編譯 Crystal 編譯器,我們需要一個較舊的 Crystal 編譯器,所以為尚未有編譯器的系統產生編譯器的兩種方法是:
- 我們檢查以 Ruby 編寫的編譯器的最新版本,並從該編譯器編譯下一個版本直到當前版本。
- 我們在目標系統中建立一個
.o
檔案,並從該檔案建立一個編譯器。
第一種方法既冗長又繁瑣,而第二種方法則容易得多。
交叉編譯可以針對其他執行檔完成,但其主要目標是編譯器。如果 Crystal 在某些系統中不可用,您可以嘗試在那裡交叉編譯它。