"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Zig! Você pode C?

Zig! Você pode C?

Publicado em 2024-08-05
Navegar:955

Zig! Can you C?

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!

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/fazibear/zig-can-you-c-3adl Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

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