Нужна помощь в использовании библиотеки C в zig

#zig

Вопрос:

Я пытаюсь перенести библиотеку microUI из C в zig.

Я попытался использовать эту попытку порта https://gitdab.com/luna/zig-microui в качестве ориентира, но, похоже, это не работает.

Вот разбивка моей попытки до сих пор:

MicroUI-это очень простая программа, состоящая из одного файла .h и одного файла .c. оба этих файла расположены в корне моего проекта в папке «./microui».

Мое телосложение.зиг:

 const std = @import("std");

const c_args = [_][]const u8{
    "-Wall",
    "-std=c11",
    "-pedantic",
    // prevent sigill
    "-fno-sanitize=undefined",
};

pub fn build(b: *std.build.Builder) void {
    // Standard release options allow the person running `zig build` to select
    // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
    const mode = b.standardReleaseOptions();

    const lib = b.addStaticLibrary("ZigMicroUI", "src/main.zig");
    lib.linkSystemLibrary("c");
    lib.linkLibC();
    lib.addIncludeDir("./microui");
    lib.addCSourceFile("microui/microui.c", amp;c_args);

    lib.setBuildMode(mode);
    lib.install();

    var main_tests = b.addTest("src/main.zig");
    main_tests.setBuildMode(mode);

    const test_step = b.step("test", "Run library tests");
    test_step.dependOn(amp;main_tests.step);
}
 

c.зигзаг:

 pub usingnamespace @cImport({
    @cInclude("microui.h");
});
 

Соответствующая часть main.zig:

 const std = @import("std");
const testing = std.testing;
const c = @import("c.zig");

export fn begin_window() void {
   const ctx: c.mu_Context = null;
}
 

Вывод из «теста сборки zig»:

 .srcc.zig:1:20: error: C import failed
pub usingnamespace @cImport({
                   ^
.srcc.zig:1:20: note: libc headers not available; compilation does not link against libc
pub usingnamespace @cImport({
                   ^
.zig-cacheo13eb3e1efd6fe219480e321f33592aecimport.h:1:10: note: 'microui.h' file not found
#include <microui.h>
         ^
.srcmain.zig:6:16: error: container 'c' has no member called 'mu_Context'
   const ctx: c.mu_Context = null;
 

Я чувствую, что это должно быть что-то маленькое, чего мне не хватает, если кто-нибудь может помочь.

Ответ №1:

Вы также должны добавить конфигурацию в main_tests:

 main_tests.linkLibC();
main_tests.addIncludeDir("microui");
main_tests.addCSourceFile("microui/microui.c", amp;c_args);
 

Тогда zig build test будет работать.