”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 齐格!你可以C吗?

齐格!你可以C吗?

发布于2024-08-05
浏览:758

Zig! Can you C?

我只是想开发一些不同的东西。但什么?游戏、图形、声音处理?
你肯定会说 Rust!是的,用 Rust 做了很多事情。但也许C?

噢...不...
还记得分段错误吗?
您将如何管理依赖关系?

好的,所以尝试在 ZIG 中使用一些 C 库!会有多难?让我们来看看。

尝试使用 raylib 编写简单的应用程序。

$ mkdir ray_test_zig
$ cd ray_test_zig
$ zig init-exe

有一个项目。尝试运行吗?

$ zig build run

是的,它正在工作。
我们需要以某种方式获取并包含 raylib。

Zig 使用 zon 来获取依赖项。它可以与 C 库一起使用吗?查出!

我们需要提供库的位置!这里是:

创建build.zig.zon文件。

.{
    .name = "ray_test_zig",
    .version = "0.0.1",

    .dependencies = .{
        .raylib = .{
            .url = "https://github.com/raysan5/raylib/archive/refs/tags/5.0.tar.gz",
        },
    },
}

尝试构建项目?

$ zig build

这是什么?

Fetch Packages... raylib... ./ray_test_zig/build.zig.zon:7:20: error: url field is missing corresponding hash field
.url = "https://github.com/raysan5/raylib/archive/refs/tags/5.0.tar.gz",
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: expected .hash = "1220c28847ca8e8756734ae84355802b764c9d9cf4de057dbc6fc2b15c56e726f27b",

好吧,zon 需要一个哈希值,以防万一有人试图破解计算机。再次:

.{
    .name = "ray_test_zig",
    .version = "0.0.1",

    .dependencies = .{
        .raylib = .{
            .url = "https://github.com/raysan5/raylib/archive/refs/tags/5.0.tar.gz",
            .hash = "1220c28847ca8e8756734ae84355802b764c9d9cf4de057dbc6fc2b15c56e726f27b",
        },
    },
}

再试一次:

$ zig build

有用!哇哦!就是这样?

不!我们需要告诉 zig 在构建过程中包含 raylib!

现在我们将编辑build.zig。就在第 ~30 行上方,我们有 b.installArtifact(exe);
在该行之前我们需要添加:

const raylib = b.dependency("raylib", .{
    .target = target,
    .optimize = optimize,
});

exe.installLibraryHeaders(raylib.artifact("raylib"));
exe.linkLibrary(raylib.artifact("raylib"));

我们正在告诉 zig 头文件所在位置,并使用 raylib 链接出可执行文件。
有效吗?让我们检查!

$ zig build

我的天啊!看起来 raylib 发生了一些事情。编译通过了吗?
让我们将一个简单的示例从 raylib 移植到 zig。

在 src/main.zig 中:

const std = @import("std");

const ray = @cImport({
    @cInclude("raylib.h");
});

pub fn main() !void {
    ray.InitWindow(800, 450, "Hey ZIG");
    defer ray.CloseWindow();

    while (!ray.WindowShouldClose()) {
        ray.BeginDrawing();
        ray.ClearBackground(ray.RAYWHITE);
        ray.DrawText("Congrats! You created your first window!", 190, 200, 20, ray.LIGHTGRAY);
        ray.EndDrawing();
    }
}
$ zig build

没有错误?伟大的!

$ zig build run

我们得到了 raylib 窗口!
如你看到的!只需一行代码,raylib 就可以像原生 lib 一样工作!

所以是的! Zig 可以 C!

版本声明 本文转载于:https://dev.to/fazibear/zig-can-you-c-3adl如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何解决 MySQL C# 中的文本编码问题?
    如何解决 MySQL C# 中的文本编码问题?
    修复 MySQL C# 中的文本编码问题使用实体框架在 C# 中处理 MySQL 数据库时,用户可能会遇到文本编码问题,特别是带有特殊字符,例如“ë”,渲染不正确。本文探讨了解决此常见问题的最合适的解决方案。要纠正编码问题,必须执行以下操作:验证排序规则设置: 确保所涉及的数据库或表的排序规则与 U...
    编程 发布于2024-11-06
  • 如何将美丽搜索与 Node.js 集成
    如何将美丽搜索与 Node.js 集成
    作为 Node.js 开发人员,构建能够提供快速且准确的搜索结果的应用程序非常重要。用户期望立即得到相关的响应,但实现起来可能具有挑战性,特别是在处理大型数据集时。 这就是美丽搜索的用武之地——一个为轻松满足这些需求而构建的搜索引擎。 什么是美丽搜索? Meilisearch 是一个...
    编程 发布于2024-11-06
  • 并行 JavaScript 机
    并行 JavaScript 机
    作者:Vladas Saulis,PE Prodata,克莱佩达,立陶宛 2024 年 5 月 18 日 抽象的 本文提出了一种新的编程模型,可以以简单且自动平衡的方式利用多核 CPU 系统。该模型还提出了一种更简单的编程范例,用于在大多数大规模并行计算领域(例如天气预报、核物理、搜索引擎等)开发并...
    编程 发布于2024-11-06
  • 推荐项目:人事管理系统数据库设置
    推荐项目:人事管理系统数据库设置
    LabEx 的这个综合项目提供了深入研究数据库管理世界的宝贵机会,重点是人事管理系统的创建和实施。无论您是新手数据库管理员还是经验丰富的开发人员,这种实践经验都将为您提供必要的技能,以便在关系数据库环境中有效管理和操作数据。 深入了解数据库基础知识 该项目首先引导您完成使用 sudo...
    编程 发布于2024-11-06
  • Python 中实例方法和类方法有什么区别?
    Python 中实例方法和类方法有什么区别?
    类与实例方法Python 的 PEP 8 风格指南建议使用“self”作为实例方法的第一个参数,使用“cls”作为类方法的第一个参数。理解这两类方法之间的区别对于有效的面向对象编程至关重要。实例方法实例方法与类的特定实例相关联。它们对实例的数据进行操作,并且通常接收“self”作为它们的第一个参数。...
    编程 发布于2024-11-06
  • 将 AdoptiumJDK 源代码加载到 Eclipse IDE 中
    将 AdoptiumJDK 源代码加载到 Eclipse IDE 中
    AdoptiumJDK 的安装程序中没有内置源代码文件,如果您需要通过 Eclipse IDE 检查如何使用任何本机 JDK 方法,这是不可能的。 按照以下步骤在Eclipse IDE中加载源代码: 访问 AdoptiumJDK 官方网站并按所需的 JDK 版本进行过滤,在我的例子中是 11.0.2...
    编程 发布于2024-11-06
  • 绝对定位与相对定位:为什么它们的行为如此不同?
    绝对定位与相对定位:为什么它们的行为如此不同?
    了解绝对位置与相对位置:宽度、高度等处理网页上的元素定位时,了解这些概念绝对位置与相对位置的区别至关重要。让我们深入探讨经常引起疑问的四个关键点:1。相对宽度与绝对宽度为什么相对定位的div自动占据100%宽度,而绝对定位的div只占据内容宽度?原因是设置位置:absolute 从文档结构的正常流程...
    编程 发布于2024-11-06
  • Python、Node js 和 PHP 中用于验证码识别的顶级模块
    Python、Node js 和 PHP 中用于验证码识别的顶级模块
    在我们的自动化时代,大多数解决方案都可以免费找到,我现在不是在谈论解决数学问题,而是稍微复杂的任务,例如数据解析,和我们的例子一样,还有 recapcha 识别。但如何找到一个好的模块呢?毕竟,随着技术的发展,每个人都得到了它,无论是认真的开发人员还是彻头彻尾的骗子。 我分析了验证码识别模块的市场,...
    编程 发布于2024-11-06
  • 以下是一些标题选项,重点关注问题格式和核心内容:

**选项 1(直接且简洁):**

* **如何在 PHP 中高效地循环多维数组?**

**选项2
    以下是一些标题选项,重点关注问题格式和核心内容: **选项 1(直接且简洁):** * **如何在 PHP 中高效地循环多维数组?** **选项2
    在 PHP 中循环多维数组多维数组可能是解析的一个挑战,特别是在处理不同深度级别和非顺序索引时。考虑一个保存事件信息的数组,其中可以包含多个艺术家及其相应的链接,如下所示:array(2) { [1]=> array(3) { ["eventID"]...
    编程 发布于2024-11-06
  • 通过 Linting 提高代码质量
    通过 Linting 提高代码质量
    Whenever I start a new project, one of the first things I do is put in place a code linter. For the uninitiated, linters analyze your project and call...
    编程 发布于2024-11-06
  • 如何有效地执行JavaScript中的回调函数?
    如何有效地执行JavaScript中的回调函数?
    理解 JavaScript 中回调函数的本质在 JavaScript 中,回调函数提供了一种方便的机制,可以在另一个函数完成后执行一个函数它的执行。虽然概念很简单,但回调的最佳实现有时可能不清楚。让我们探讨一个简化的示例:var myCallBackExample = { myFirstFu...
    编程 发布于2024-11-06
  • Vue 框架简介
    Vue 框架简介
    What is Vue? from the Vue website Vue is a "progressive" JavaScript framework for building user interfaces. It works by build...
    编程 发布于2024-11-06
  • 逃离戏剧:为什么 HydePHP 是您的 WordPress 替代品
    逃离戏剧:为什么 HydePHP 是您的 WordPress 替代品
    WordPress 戏剧 随着 WordPress 生态系统面临前所未有的混乱,许多开发人员和网站所有者正在重新考虑他们的平台选择。最近 WordPress 联合创始人 Matt Mullenweg 和 WP Engine 之间的冲突凸显了 WordPress 社区内的控制、贡献和...
    编程 发布于2024-11-06
  • Go 中的并发模式;工作池和扇出/扇入
    Go 中的并发模式;工作池和扇出/扇入
    Go 以其卓越的并发模型而闻名,但许多开发人员只关注 goroutine 和通道。然而,工作池和扇出/扇入等并发模式提供了真正的效率。 本文将介绍这些高级概念,帮助您最大限度地提高 Go 应用程序的吞吐量。 为什么并发很重要 并发允许程序高效地执行任务,特别是在处理 I/O 操作、...
    编程 发布于2024-11-06
  • 如何在 C++ 中将单个字符转换为 std::string?
    如何在 C++ 中将单个字符转换为 std::string?
    从单个字符创建字符串人们可能会遇到需要将表示为 char 数据类型的单个字符转换为std::string。从字符串中获取字符很简单,只需在所需位置索引字符串即可。然而,相反的过程需要不同的方法。要从单个字符创建 std::string,可以使用多种方法:使用 std::string参数计数为 1:c...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3