クローズ- エントリの最後を参照してください
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.h
and (または .so) ファイルはディレクトリlibmathtest.a
に保存されますbuild
。
これを閉じる