之字形创建C库

问题描述

已关闭-查看条目的结尾

我想使用zig语言制作一个可调用C的库。 我决定从Zig文档中的两个示例开始。 “导出C库”和“混合目标文件”。 在每种情况下,我都复制了三个相关文件(来自0.6.0文档)。

  • 一个名为test.c的C文件,
  • 分别称为mathtest.zig(对于“导出C库”示例)和base64.zig(对于“混合对象文件”示例)的zig文件,以及
  • 一个build.zig文件。

两个示例均无法构建。

“导出C库”示例无法编译test.c,并显示一条消息,找不到mathtest.h

“混合对象文件”示例无法编译test.c且找不到base64.h

以下是“导出C库”示例的三个文件:

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));

    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',0));
lib.femit_h = true;

将确保

zig build test

将成功完成,并生成文档中指示的答案1379。

但是-这个build.zig文件的mod在运行后不会留下mathtest.h文件。

这似乎是从Zig代码生成可用的C库的最后障碍。

难题的最后一块

如果我添加

lib.setOutputDir("build");

build.zig文件。 mathtest.hlibmathtest.a(或.so)文件将保存到build目录中。

关闭此链接

解决方法

好吧,答案的一部分很简单,但-femit-h选项也许有些晦涩。 命令

zig build-lib mathtest.zig -femti-h

将生成一个mathtest.h文件。 但是如何将这些选项添加到

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

build.zig文件中的行。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...