我一直在尝试将旧的 vms-empire 游戏移植到 zig,或者至少使用 zig 构建。经过一些清理后,我进入了可以在 makefile 中使用
zig cc
而不是仅使用 cc
来成功构建它的阶段。
我进入了尝试创建
build.zig
文件来构建项目的阶段,它构建了,但立即崩溃了 illegal hardware instruction
。
我想知道 c 文件的
zig cc
和 zig build
的编译阶段有什么区别。
(我在 intel mac 上执行此操作,zig 版本为 0.13.0)
当前版本的 make 可以在 GitHub
中找到我想用
zig build
成功构建项目
通常,“非法硬件指令”是由于 zig 默认为 C 代码启用
-fsanitize=undefined
导致的。可以在命令行中使用 -fno-sanitize=undefined
或在 Zig 构建中使用 build.zig 中的 exe.root_module.sanitize_c = false;
禁用此功能。或者,可以使用调试器来识别和修复 C 代码中触发未定义行为的问题。
在这种情况下,
zig cc
没有触发崩溃,因为你的Makefile设置了-O2
,zig会看到并自动禁用C清理。在 zig 中,设置 -OReleaseFast
或 -Doptimize=ReleaseFast
会禁用 C 清理,并且通过在设置优化级别时禁用 C 清理来在 zig cc
中反映这一点。