«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Зиг! Можешь С?

Зиг! Можешь С?

Опубликовано 5 августа 2024 г.
Просматривать:375

Zig! Can you C?

Я просто хочу разработать что-то новое. Но что? Игра, графика, обработка звука?
Конечно, вы скажете Раст! Да, много чего сделал в Rust. Но, может быть, C?

Ох... Нееет...
Помните ошибку сегментации?
Как вы собираетесь управлять зависимостями?

Хорошо, попробуйте использовать в ZIG какую-нибудь библиотеку C! Насколько это будет тяжело? Давайте посмотрим.

Попробуйте написать простое приложение, используя raylib.

$ mkdir ray_test_zig
$ cd ray_test_zig
$ zig init-exe

Есть проект. Попробовать сбежать?

$ zig build run

Да, это работает.
Нам нужно как-то получить и подключить raylib.

Зиг использует 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 на 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 работает как родная библиотека!

Так что да! Зиг может C!

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/fazibear/zig-can-you-c-3adl. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3