4

Zig で C ライブラリを作成することはできますが、C プログラムからそのライブラリを使用しようとすると、含まれている関数の定義が見つかりません。

私のライブラリ定義:

const std = @import("std");

export fn removeAll(name: [*]const u8, len: u32) u32 {
    const n: []const u8 = name[0..len];
    std.fs.cwd().deleteTree(n) catch |err| {
        return 1;
    };
    return 0;
}

test "basic remove functionality" {
}

build.zig

const Builder = @import("std").build.Builder;

pub fn build(b: *Builder) void {
    const mode = b.standardReleaseOptions();
    const lib = b.addStaticLibrary("removeall", "src/main.zig");
    lib.setBuildMode(mode);
    switch (mode) {
        .Debug, .ReleaseSafe => lib.bundle_compiler_rt = true,
        .ReleaseFast, .ReleaseSmall => lib.disable_stack_probing = true,
    }
    lib.force_pic = true;
    lib.setOutputDir("build");
    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(&main_tests.step);
}

zig buildlibremoveall.aスタティック ライブラリを含むビルド ディレクトリを作成します。

私のCプログラム:

#include <stdio.h>

int removeAll(char *, int);

int main(int argc, char **argv)
{
    removeAll("/tmp/mytest/abc", 15);
    return 0;
}

C プログラムにインクルードしようとすると、次のエラーが発生します。

gcc -o main build/libremoveall.a main.c
/usr/bin/ld: /tmp/cckS27fw.o: in function 'main':
main.c:(.text+0x20): undefined reference to 'removeAll'

私が間違っていることについてのアイデアはありますか?ありがとう

編集

Paul R と stark に感謝します。順序が重要な理由を理解するのを手伝ってもらえますか?

4

1 に答える 1