Kurz: Zig kann C-Header direkt einlesen und C-Funktionen ohne Bindings aufrufen. Außerdem ist zig cc ein vollwertiger C/C++-Compiler (Clang) mit hervorragendem Cross-Compiling:
Teil des Kurses Zig
C-Interop
Zig kann C-Header direkt einlesen und C-Funktionen ohne Bindings aufrufen. Außerdem ist zig cc ein vollwertiger C/C++-Compiler (Clang) mit hervorragendem Cross-Compiling:
const std = @import("std");
const c = @cImport({
@cInclude("stdio.h");
@cInclude("stdlib.h");
@cInclude("string.h");
@cInclude("math.h");
});
pub fn main() !void {
const out = std.io.getStdOut().writer();
try out.print("{d}\n", .{c.abs(-42)});
try out.print("{d:.3}\n", .{c.sqrt(2.0)});
try out.print("{d}\n", .{c.strlen("Hallo")});
const n = c.atoi("1234");
try out.print("{d}\n", .{n + 1});
}zig run -lc c_interop.zigAuch umgekehrt: Zig-Funktionen mit export fn und callconv(.C) sind aus C aufrufbar. Cross-Compiling:
zig build-exe hallo.zig -target x86_64-windows # Windows-Programm unter Linux bauen
zig build-exe hallo.zig -target aarch64-macos # für Apple Silicon
zig build-exe hallo.zig -target arm-linux-musleabihf # Raspberry Pi
zig cc -target x86_64-linux-musl -o prog prog.c # C-Code mit Zig kompilierenDas Build-System
Projekte beschreibt build.zig – in Zig selbst:
const std = @import("std");
pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const exe = b.addExecutable(.{
.name = "meine_app",
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
});
b.installArtifact(exe);
const run = b.addRunArtifact(exe);
b.step("run", "App starten").dependOn(&run.step);
const tests = b.addTest(.{ .root_source_file = b.path("src/main.zig"), .target = target, .optimize = optimize });
b.step("test", "Tests ausführen").dependOn(&b.addRunArtifact(tests).step);
}zig build # bauen
zig build run # starten
zig build test # Tests
zig build -Doptimize=ReleaseFast
zig fmt src/ # formatierenPakete (Abhängigkeiten) trägst du in build.zig.zon ein.
Merke
- C-Header per
@cImport, Cross-Compiling mit-target,zig ccals C-Compiler build.zigbeschreibt Projekte in Zig;zig build run/test- Abhängigkeiten stehen in
build.zig.zon
Übungsaufgabe
Rufe aus Zig die C-Funktion pow aus math.h auf und gib pow(2, 10) aus.
Quiz zur Selbstkontrolle
Wofür ist zig cc?
- Ein C/C++-Compiler auf Basis von Clang mit Cross-Compiling (richtig)
- Ein Zig-Checker
- Ein Debugger
- Ein Paketmanager
In welcher Sprache wird das Zig-Build-System konfiguriert?
- In Zig selbst (build.zig) (richtig)
- In JSON
- In Makefile-Syntax
- In YAML
Wie bindet man C-Header ein?
- @cImport mit @cInclude (richtig)
- #include
- import “c”
- use c::
Weiter im Kurs
Zurück: comptime, Generics und Tests
Weiter: Nebenläufigkeit und Spickzettel
Alle Kapitel: Zig im Überblick