Я просто хочу разработать что-то новое. Но что? Игра, графика, обработка звука?
Конечно, вы скажете Раст! Да, много чего сделал в 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!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3