交叉编译¶
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 在某些系统中不可用,您可以尝试对其进行交叉编译。