Eu só quero desenvolver algo diferente. Mas o que? Jogo, gráficos, processamento de som?
Certamente você dirá Rust! Sim, fiz muitas coisas em Rust. Mas talvez C?
Ohhh... Nãooooo...
Lembra da falha de segmentação?
Como você vai gerenciar dependências?
OK, então tente usar alguma biblioteca C no ZIG! Quão difícil será? Vamos ver.
Tente escrever um aplicativo simples usando raylib.
$ mkdir ray_test_zig $ cd ray_test_zig $ zig init-exe
Tenho um projeto. Tentar correr?
$ zig build run
Sim, está funcionando.
Precisamos buscar e incluir o raylib de alguma forma.
Zig usa zon para buscar dependências. Funciona com bibliotecas C? Descobrir!
Precisamos fornecer onde está a biblioteca! Aqui está:
Crie o arquivo 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", }, }, }
Tentar construir o projeto?
$ zig build
O que é isso?
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 um hash, caso alguém tente hackear o computador. Outra vez:
.{ .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", }, }, }
Tente novamente:
$ zig build
Funciona! Uau! É isso?
Não! Precisamos dizer ao zig para incluir o raylib durante a construção!
Agora vamos editar build.zig. Logo acima da linha ~30 temos b.installArtifact(exe);
Antes dessa linha, precisamos adicionar:
const raylib = b.dependency("raylib", .{ .target = target, .optimize = optimize, }); exe.installLibraryHeaders(raylib.artifact("raylib")); exe.linkLibrary(raylib.artifact("raylib"));
Estamos informando ao zig onde estão os arquivos de cabeçalho e vinculando o executável ao raylib.
Isso funciona? Vamos checar!
$ zig build
OH MEU DEUS! Parece que algo aconteceu com o raylib. Está compilado?
Vamos portar um exemplo simples de raylib para zig.
No 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
Sem erros? Ótimo!
$ zig build run
Temos a janela raylib!
Como você pode ver! Apenas uma linha de código e raylib funcionando como lib nativa!
Então sim! Zig pode C!
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3