Zig! Bolehkah anda C?

WBOY
Lepaskan: 2024-07-17 03:48:39
asal
560 orang telah melayarinya

Zig! Can you C?

Saya hanya mahu mengembangkan sesuatu yang berbeza. Tetapi apa? Permainan, grafik, pemprosesan bunyi?
Pasti anda akan berkata Rust! Yap melakukan banyak perkara di Rust. Tetapi mungkin C?

Ohhh... Nooooo...
Ingat Segmentation Fault?
Bagaimanakah anda hendak menguruskan tanggungan?

OK, Jadi cuba gunakan beberapa perpustakaan C dalam ZIG! Betapa sukarnya? Jom tengok.

Cuba tulis apl sederhana menggunakan raylib.

$ mkdir ray_test_zig
$ cd ray_test_zig
$ zig init-exe
Salin selepas log masuk

Ada projek. Cuba lari?

$ zig build run
Salin selepas log masuk
Salin selepas log masuk

Ya, ia berfungsi.
Kami perlu mengambil dan memasukkan raylib entah bagaimana.

Zig menggunakan zon untuk mengambil kebergantungan. Adakah ia berfungsi dengan perpustakaan C? Ketahui!

Kami perlu menyediakan tempat lib itu! Ini dia:

Buat fail 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",
        },
    },
}
Salin selepas log masuk

Cuba bina projek?

$ zig build
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Apa itu?

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",
Salin selepas log masuk

Ok, zon menjangkakan cincangan, sekiranya seseorang akan cuba menggodam komputer. Sekali lagi:

.{
    .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",
        },
    },
}
Salin selepas log masuk

Cuba sekali lagi:

$ zig build
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ia berkesan! Woooow! Itu sahaja?

Tidak! Kami perlu memberitahu zig untuk memasukkan raylib semasa membina!

Sekarang kita akan mengedit build.zig. Hanya di atas baris ~30 kita ada b.installArtifact(exe);
Sebelum baris itu kita perlu menambah:

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

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

Salin selepas log masuk

Kami menghantar zig di mana fail pengepala berada dan untuk memautkan boleh laku dengan raylib.
Adakah ia berfungsi? Jom semak!

$ zig build
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

OMG! Nampaknya sesuatu dengan raylib telah berlaku. Ia disusun?
Mari kita alihkan contoh mudah daripada raylib ke zig.

Dalam 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();
    }
}
Salin selepas log masuk
$ zig build
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Tiada ralat? Hebat!

$ zig build run
Salin selepas log masuk
Salin selepas log masuk

Kami mendapat tingkap raylib!
Seperti yang anda boleh lihat! Hanya satu baris kod dan raylib berfungsi seperti lib asli!

Jadi ya! Zig boleh C!

Atas ialah kandungan terperinci Zig! Bolehkah anda C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan