1

クローズ- エントリの最後を参照してください

zig 言語を使用して C 呼び出し可能なライブラリを作成したいと考えています。Zig のドキュメントにある 2 つの例から始めることにしました。「C ライブラリのエクスポート」および「オブジェクト ファイルの混合」。いずれの場合も、関連する 3 つのファイルを (0.6.0 ドキュメントから) コピーしました。

  • test.c という名前の AC ファイル、
  • それぞれ mathtest.zig (C ライブラリのエクスポートの例) および base64.zig (オブジェクト ファイルの混合の例) という名前の zig ファイル、および
  • build.zig ファイル。

どちらの例もビルドに失敗します。

C ライブラリのエクスポートの例が test.c のコンパイルに失敗し、mathtest.h が見つからないというメッセージが表示される

Mixing Object Files の例では、base64.h が見つからないため、test.c のコンパイルに失敗します。

C ライブラリのエクスポートの例の 3 つのファイルを次に示します。

mathtest.zig

export fn add(a: i32, b: i32) i32 {
    return a + b;
}

test.c

// This header is generated by zig from mathtest.zig
#include "mathtest.h"
#include <stdio.h>

int main(int argc, char **argv) {
    int32_t result = add(42, 1337);
    printf("%d\n", result);
    return 0;
}

build.zig

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

pub fn build(b: *Builder) void {
    const lib = b.addSharedLibrary("mathtest", "mathtest.zig", b.version(1, 0, 0));

    const exe = b.addExecutable("test", null);
    exe.addCSourceFile("test.c", &[_][]const u8{"-std=c99"});
    exe.linkLibrary(lib);
    exe.linkSystemLibrary("c");

    b.default_step.dependOn(&exe.step);

    const run_cmd = exe.run();

    const test_step = b.step("test", "Test the program");
    test_step.dependOn(&run_cmd.step);
}

エラーメッセージの一部

~/Projects/zig/z-c-lib $ zig build test
/home/robert/Projects/zig/z-c-lib/test.c:2:10: fatal error: 'mathtest.h' file not found
#include "mathtest.h"
         ^~~~~~~~~~~~
1 error generated.

The following command failed:
/home/robert/zig/zig clang -c -nostdinc -fno-spell-checking -target x86_64-unknown-linux-gnu -isystem /home/robert/zig/lib/zig/include -isystem /home/robert/zig/lib/zig/libc/include/x86_64-linux-gnu -isystem /home/robert/zig/lib/zig/libc/include/generic-glibc -isystem /home/robert/zig/lib/zig/libc/include/x86_64-linux-any -isystem /home/robert/zig/lib/zig/libc/include/any-linux-any -Xclang -target-cpu -Xclang znver2 -Xclang -target-feature -Xclang -3dnow -Xclang -target-feature -Xclang -3dnowa -Xclang -target-feature -Xclang +64bit -Xclang -target-feature -Xclang +adx -Xclang -target-feature -Xclang +aes -Xclang -target-feature -Xclang +avx -Xclang -target-feature -Xclang +avx2 -Xclang -target-feature -Xclang -avx512bf16 -Xclang -target-feature -Xclang -avx512b

私のシステムで名前の付いたファイルが見つからないmathtest.hので、test.c ファイルの主張に反して、生成されていないと思います。

何が欠けていますか?感謝して受け入れた助け。

回答とその他の質問

-femit-hオプションを発見しました:

zig build-lib mathtest.zig -femit-h

mathtest.hファイルを作成してから

zig build

成功します。

build.zig私はさらに、ファイル内のこれらの行を発見しました

const lib = b.addSharedLibrary('mathtest', 'mathtest.zig', b.version(1, 0, 0));
lib.femit_h = true;

それを保証します

zig build test

ドキュメントに示されているように、成功し、回答1379が生成されます。

しかし - build.zig ファイルへのこの mod は、mathtest.h実行後にファイルを残しません。

これが、Zig コードから使用可能な C ライブラリを生成するための最後のハードルのようです。

パズルの最後のピース

追加すると

lib.setOutputDir("build");

build.zigファイルに。mathtest.hand (または .so) ファイルはディレクトリlibmathtest.aに保存されますbuild

これを閉じる

4

1 に答える 1

2

わかりましたので、答えの一部は単純ですが、おそらくあいまいな -femit-h オプションです。コマンド

zig build-lib mathtest.zig -femti-h

ファイルを生成しmathtest.hます。しかし、そのオプションを

const lib = b.addSharedLibrary("mathtest", "mathtest.zig", b.version(1, 0, 0));

build.zig ファイルの行。

于 2020-10-20T19:00:01.650 に答える