"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > منعرج! هل تستطيع ج؟

منعرج! هل تستطيع ج؟

تم النشر بتاريخ 2024-08-05
تصفح:670

Zig! Can you C?

أريد فقط تطوير شيء مختلف. ولكن ماذا؟ اللعبة، الرسومات، معالجة الصوت؟
بالتأكيد ستقول الصدأ! نعم فعلت الكثير من الأشياء في الصدأ. ولكن ربما C؟

أوه... لا...
تذكر خطأ التقسيم؟
كيف ستدير التبعيات؟

حسنًا، حاول استخدام بعض مكتبات C في ZIG! ما مدى صعوبة الأمر؟ دعنا نرى.

حاول كتابة تطبيق بسيط باستخدام 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

إنها تعمل! واووووو! هذا كل شيء؟

لا! نحن بحاجة إلى إخبار zig بتضمين raylib أثناء الإنشاء!

الآن سنقوم بتحرير 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 إلى 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 يعملان مثل lib الأصلي!

إذن نعم! منعرج يمكن C!

بيان الافراج تم نشر هذه المقالة على: https://dev.to/fazibear/zig-can-you-c-3adl إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3