跳至内容

交叉编译

Crystal 支持一种基本的 交叉编译 形式。

为了实现这一点,编译器可执行文件提供了两个标志

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