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
Ada projek. Cuba lari?
$ zig build run
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", }, }, }
Cuba bina projek?
$ zig build
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",
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", }, }, }
Cuba sekali lagi:
$ zig build
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"));
Kami menghantar zig di mana fail pengepala berada dan untuk memautkan boleh laku dengan raylib.
Adakah ia berfungsi? Jom semak!
$ zig build
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(); } }
$ zig build
Tiada ralat? Hebat!
$ zig build run
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!