首頁 >後端開發 >C++ >齊格!你可以C嗎?

齊格!你可以C嗎?

WBOY
WBOY原創
2024-07-17 03:48:39571瀏覽

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!

以上是齊格!你可以C嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn