Maison >développement back-end >C++ >Zig! Pouvez-vous C?

Zig! Pouvez-vous C?

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBoriginal
2024-07-17 03:48:39620parcourir

Zig! Can you C?

Je veux juste développer quelque chose de différent. Mais quoi ? Jeu, graphisme, traitement du son ?
Vous direz sûrement Rust ! Oui, j'ai fait beaucoup de choses dans Rust. Mais peut-être C ?

Ohhh... Noooon...
Vous vous souvenez d'un défaut de segmentation ?
Comment allez-vous gérer les dépendances ?

OK, alors essayez d'utiliser une bibliothèque C dans ZIG ! À quel point ce sera dur ? Voyons.

Essayez d'écrire une application simple en utilisant Raylib.

$ mkdir ray_test_zig
$ cd ray_test_zig
$ zig init-exe

J'ai un projet. Essayez de courir ?

$ zig build run

Oui, ça marche.
Nous devons récupérer et inclure Raylib d'une manière ou d'une autre.

Zig utilise zon pour récupérer les dépendances. Est-ce que ça marche avec les bibliothèques C ? Découvrez-le !

Nous devons indiquer où se trouve la bibliothèque ! Le voici :

Créez le fichier 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",
        },
    },
}

Essayez de construire un projet ?

$ zig build

Qu'est-ce que c'est ?

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 attend un hachage, juste au cas où quelqu'un essaierait de pirater l'ordinateur. Encore une fois :

.{
    .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",
        },
    },
}

Essayez encore :

$ zig build

Ça marche ! Waouh ! C'est ça ?

Non ! Nous devons dire à zig d'inclure Raylib lors de la construction !

Nous allons maintenant éditer build.zig. Juste au-dessus de la ligne ~30, nous avons b.installArtifact(exe);
Avant cette ligne, nous devons ajouter :

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

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

Nous indiquons à zig où se trouvent les fichiers d'en-tête et lions l'exécutable avec Raylib.
Est-ce que ça marche ? Vérifions !

$ zig build

OMG ! On dirait que quelque chose s'est produit avec Raylib. C'est compilé ?
Portons un exemple simple de Raylib vers zig.

Dans le 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

Aucune erreur ? Super !

$ zig build run

Nous avons la fenêtre Raylib !
Comme vous pouvez le voir! Une seule ligne de code et Raylib fonctionne comme une bibliothèque native !

Alors oui ! Zig peut C !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn