0

Soy programador de C pero quero empesar a programar en Zig ya que es un lenguaje de alto nivel totalmente compatible con C. Queria saber como puedo importar libreras de C en Zig

const std = @import("std");

const c = @cImport(@cInclude("stdio.h"));

pub fn main() void {
  _ = c.printf("Hola Mundo");
}
4
  • Hola Ismael, no soy experto en Zig, más bien solo lo he probado por curiosidad, pero el código se ve correcto ¿Tienen algún error al compilar ese código o es una pregunta genérica? Si tienes problemas con ese código ¿estás enlazando libc? ¿compilas via linea de comandos o mediante un build.zig?
    – FJSevilla
    Commented el 1 jul. a las 20:51
  • Da error al intentar compilarlo. Dise que no encuentra la libreria stdio.h Commented el 1 jul. a las 22:16
  • Creo que es std en vez de srd. Tal vez esto te sirva ziglang.org/documentation/0.13.0/#Import-from-C-Header-File
    – Mateo
    Commented el 1 jul. a las 22:42
  • Me confundi, se que es std Commented el 2 jul. a las 1:43

1 respuesta 1

0

Tu código es correcto y zig ya incluye las librerias de C para multiples plataformas. El problema es que para poder hacer uso de cImport y poder importar stdio es necesario enlazar libc explícitamente.

Partiendo de tu código, al que guardaremos como test.zig para el ejemplo:

test.zig

const c = @cImport(@cInclude("stdio.h"));

pub fn main() void {
  _ = c.printf("Hola Mundo");
}

Compilando directamente desde la linea de comandos

En este caso debes usar la opción -lc/--library c:

$ zig run test.zig -lc

$ zig run test.zig --library c

Exactamente igual si estás compilando a un ejecutable:

$ zig build-exe test.zig -lc
$ ./test

$ zig build-exe test.zig --library c
$ ./test

Puedes probarlo online (observa el uso de la opción -lc en el compilador):

https://zig.godbolt.org/z/h5aWEGsrd

Usando Zig Build System

En este caso debemos usar exe.linkLibC() en nuestro build.zig, para nuestro ejemplo:

build.zig

const std = @import("std");

pub fn build(b: *std.Build) void {
    const exe = b.addExecutable(.{
        .name = "test",
        .root_source_file = b.path("test.zig"),
        .target = b.host,
    });
    exe.linkLibC();
    b.installArtifact(exe);
}

con lo que podemos construir (y posteriormente ejecutar) con:

$ zig build --summary all
$ ./zig-out/bin/test

¿No es la respuesta que buscas? Examina otras preguntas con la etiqueta o formula tu propia pregunta.