zig cc 和使用 zig build 构建 c 之间的区别

问题描述 投票:0回答:1

我一直在尝试将旧的 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

成功构建项目
c clang zig
1个回答
0
投票

通常,“非法硬件指令”是由于 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
中反映这一点。

有关此行为的文档位于:https://github.com/ziglang/zig/wiki/FAQ#why-do-i-get-illegal-instruction-when-using-with-zig-cc-to-build -c代码

© www.soinside.com 2019 - 2024. All rights reserved.