ホームページ >バックエンド開発 >C++ >ジグ! Cできますか?

ジグ! Cできますか?

WBOY
WBOYオリジナル
2024-07-17 03:48:39572ブラウズ

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 ライブラリでも動作しますか?調べてみましょう!

ライブラリの場所を指定する必要があります。それは次のとおりです:

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"));

ヘッダー ファイルの場所をジグに伝え、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 ウィンドウを入手しました!
ご覧のように!たった 1 行のコードと raylib がネイティブ ライブラリのように動作します!

そうだね!ジグキャンC!

以上がジグ! Cできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。