"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 급격한 변경! C 할 수 있나요?

급격한 변경! C 할 수 있나요?

2024-08-05에 게시됨
검색:359

Zig! Can you C?

저는 단지 뭔가 다른 것을 개발하고 싶을 뿐입니다. 근데 뭐? 게임, 그래픽, 사운드 처리?
분명히 당신은 Rust라고 말할 것입니다! 네, Rust에서는 많은 일을 했습니다. 하지만 아마도 C일까요?

오오... 안돼...
분할 오류를 기억하시나요?
종속성을 어떻게 관리할 예정인가요?

좋아, 그럼 ZIG에서 C 라이브러리를 사용해 보세요! 얼마나 힘들까요? 어디 보자.

raylib를 사용하여 간단한 앱을 작성해보세요.

$ mkdir ray_test_zig
$ cd ray_test_zig
$ zig init-exe

프로젝트가 생겼습니다. 달리려고 하시나요?

$ zig build run

네, 작동하고 있어요.
어떻게든 raylib를 가져와서 포함해야 합니다.

Zig는 zon을 사용하여 종속성을 가져옵니다. C 라이브러리에서 작동합니까? 알아내다!

lib가 어디에 있는지 제공해야 합니다! 여기있어:

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",
        },
    },
}

프로젝트를 빌드하시겠습니까?

$ zig build

무엇인가요?

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",

좋아, zon은 누군가가 컴퓨터를 해킹하려고 시도할 경우를 대비해 해시를 기대합니다. 다시 한번:

.{
    .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",
        },
    },
}

다시 한번 시도해 보세요:

$ zig build

효과가있다! 우와! 그게 다야?

아니요! 빌드 중에 raylib를 포함하도록 zig에 지시해야 합니다!

이제 build.zig를 편집하겠습니다. 30번째 줄 바로 위에는 b.installArtifact(exe);
가 있습니다. 해당 줄 앞에 다음을 추가해야 합니다:

const raylib = b.dependency("raylib", .{
    .target = target,
    .optimize = optimize,
});

exe.installLibraryHeaders(raylib.artifact("raylib"));
exe.linkLibrary(raylib.artifact("raylib"));

헤더 파일이 있는 위치를 zig로 알려주고 실행 파일을 raylib와 연결합니다.
작동합니까? 점검 해보자!

$ zig build

어머나! raylib에 문제가 발생한 것 같습니다. 컴파일되었나요?
raylib에서 zig로 간단한 예제를 포팅해 보겠습니다.

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

오류가 없나요? 엄청난!

$ zig build run

Raylib 창이 생겼습니다!
보시다시피! 단 한 줄의 코드와 raylib가 네이티브 lib처럼 작동합니다!

그래요! 지그 캔 C!

릴리스 선언문 이 글은 https://dev.to/fazibear/zig-can-you-c-3adl에서 복제되었습니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3