如何使用zig编译器编译nim代码?

4
Nim会将自己的代码转换为C代码,并使用C编译器进行编译。Zig具有自己的编译器,具有许多不错的功能,使您想使用它,例如允许您选择要动态链接的glibc版本,或者更容易进行交叉编译。
因此,我想使用zig编译器来编译我的Nim代码,但这是否可行呢?
2个回答

4
Nim提供了使用zig编译器的方法,因为Clang是其可行的后端之一。
要使用它,您需要使用clang编译器并传递标志以显式使用zig的编译器进行链接和编译。这个过程并不复杂,但涉及多个步骤:
  1. 安装zig
  2. 编写一个名为zigcc的bash或其他shell脚本,其唯一目的是调用zig编译器。这是必需的,因为确定使用哪个编译器的标志在其参数中不允许带有空格,但我们确实需要它。编写完成后,将zigcc移动到路径环境变量上的某个目录中,例如Linux上的/usr/local/bin,或将包含zigcc脚本的目录的路径添加到PATH变量中。
或者,您可以直接通过nimble安装此软件包nimble install https://github.com/enthus1ast/zigcc),其中包含正好此类脚本,该脚本将安装到已经在您路径上的nimble目录中。
如果您想编写自己的shell脚本,下面是一个使用bash的示例:
#!/bin/sh
zig cc $@
  1. 现在,您可以调用Nim并告知Clang使用zigcc进行编译。以下是一个示例bash脚本,您可以用于这些目的:
#!/bin/sh
nim c \
--cc:clang \
--clang.exe="zigcc" \
--clang.linkerexe="zigcc" \
--forceBuild:on \
--opt:speed \
src/<YOUR_MAIN_FILE>.nim

如果您想使用 zigcc 指定 glibc 版本,只需将以下标志添加到上述命令中(将 X.XX 替换为所需的 glibc 版本):
--passC:"-target x86_64-linux-gnu.X.XX -fno-sanitize=undefined" \
--passL:"-target x86_64-linux-gnu.X.XX -fno-sanitize=undefined" \

1

编写一个Nim程序(zigcc.nim编译为zigcc.exe):

import std/osproc
import os

var pStr: string = "zig cc"

for i in 1..paramCount():
    pStr.add(" "&paramStr(i))
discard execShellCmd(pStr)

将nim.exe和zig.exe的路径设置为环境变量,将zigcc.exe复制到Zig的主目录中,然后像这样调用Nim:

nim c --cc:clang --clang.exe="zigcc" --clang.linkerexe="zigcc" yourFileName.nim

神奇的事情发生了...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接