Solo quiero desarrollar algo diferente. ¿Pero que? ¿Juego, gráficos, procesamiento de sonido?
¡Seguro que dirás Rust! Sí, hice muchas cosas en Rust. ¿Pero tal vez C?
Ohhh... Nooo...
¿Recuerda el error de segmentación?
¿Cómo vas a gestionar las dependencias?
OK, ¡intenta usar alguna biblioteca C en ZIG! ¿Qué tan difícil será? Vamos a ver.
Intenta escribir una aplicación simple usando raylib.
$ mkdir ray_test_zig $ cd ray_test_zig $ zig init-exe
Tengo un proyecto. ¿Intentar correr?
$ zig build run
Sí, está funcionando.
Necesitamos recuperar e incluir raylib de alguna manera.
Zig usa zon para buscar dependencias. ¿Funciona con bibliotecas C? ¡Descubrir!
¡Necesitamos proporcionar dónde está la biblioteca! Aquí lo tienes:
Crear archivo 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", }, }, }
¿Intentar construir un proyecto?
$ zig build
¿Lo que es?
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 espera un hash, en caso de que alguien intente piratear la computadora. Una vez más:
.{ .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", }, }, }
Inténtalo de nuevo:
$ zig build
¡Funciona! ¡Guau! ¿Eso es todo?
¡No! ¡Necesitamos decirle a zig que incluya raylib durante la compilación!
Ahora editaremos build.zig. Justo encima de la línea ~30 tenemos b.installArtifact(exe);
Antes de esa línea debemos agregar:
const raylib = b.dependency("raylib", .{ .target = target, .optimize = optimize, }); exe.installLibraryHeaders(raylib.artifact("raylib")); exe.linkLibrary(raylib.artifact("raylib"));
Le estamos diciendo a Zig dónde están los archivos de encabezado y vinculando el ejecutable con raylib.
¿Funciona? ¡Vamos a revisar!
$ zig build
¡DIOS MÍO! Parece que algo sucedió con raylib. ¿Está compilado?
Portemos un ejemplo simple de raylib a zig.
En 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
¿Sin errores? ¡Excelente!
$ zig build run
¡Tenemos la ventana raylib!
¡Como se puede ver! ¡Solo una línea de código y raylib funciona como una biblioteca nativa!
¡Así que sí! ¡Zig puede C!
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3