Heim >Backend-Entwicklung >C++ >Zick! Kannst du C?

Zick! Kannst du C?

WBOY
WBOYOriginal
2024-07-17 03:48:39565Durchsuche

Zig! Can you C?

Ich möchte einfach etwas anderes entwickeln. Aber was? Spiel, Grafik, Soundverarbeitung?
Sicherlich werden Sie Rust sagen! Ja, ich habe eine Menge Dinge in Rust gemacht. Aber vielleicht C?

Ohhh... Nein...
Erinnern Sie sich an den Segmentierungsfehler?
Wie gehen Sie mit Abhängigkeiten um?

OK, versuchen Sie also, eine C-Bibliothek in ZIG zu verwenden! Wie schwer wird es sein? Mal sehen.

Versuchen Sie, eine einfache App mit Raylib zu schreiben.

$ mkdir ray_test_zig
$ cd ray_test_zig
$ zig init-exe

Habe ein Projekt. Versuchen Sie zu rennen?

$ zig build run

Ja, es funktioniert.
Wir müssen Raylib irgendwie abrufen und einbinden.

Zig verwendet zon, um Abhängigkeiten abzurufen. Funktioniert es mit C-Bibliotheken? Finden Sie es heraus!

Wir müssen angeben, wo sich die Bibliothek befindet! Hier ist es:

Build.zig.zon-Datei erstellen.

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

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

Versuchen Sie, ein Projekt zu erstellen?

$ zig build

Was ist das?

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 erwartet einen Hash, nur für den Fall, dass jemand versucht, den Computer auszuhacken. Noch einmal:

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

Versuchen Sie es noch einmal:

$ zig build

Es funktioniert! Woooow! Das ist es?

Nein! Wir müssen zig anweisen, Raylib während des Builds einzubinden!

Jetzt bearbeiten wir build.zig. Direkt über Zeile ~30 haben wir b.installArtifact(exe);
Vor dieser Zeile müssen wir Folgendes hinzufügen:

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

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

Wir teilen Ihnen im Zickzack mit, wo sich die Header-Dateien befinden, und verknüpfen die ausführbare Datei mit Raylib.
Funktioniert es? Schauen wir mal nach!

$ zig build

OMG! Es sieht so aus, als wäre etwas mit Raylib passiert. Es ist kompiliert?
Lassen Sie uns ein einfaches Beispiel von Raylib nach Zig portieren.

In der 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

Keine Fehler? Großartig!

$ zig build run

Wir haben das Raylib-Fenster!
Wie Sie sehen! Nur eine Codezeile und Raylib funktioniert wie eine native Bibliothek!

Also ja! Zick kann C!

Das obige ist der detaillierte Inhalt vonZick! Kannst du C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn