1

我想设置一个构建多个可执行文件和静态库的 zig 项目。这是我想到的结构:

build.zig
scr/
    exe0/
        depends on lib0, lib1
    exe1/
        depends on lib1
    lib0/
    lib1/

我认为一种方法是在单个 build.zig 中使用类似这样的东西来描述所有这些:

const lib0 = b.addStaticLibrary("lib0", "src/lib0/index.zig");
const lib1 = b.addStaticLibrary("lib1", "src/lib1/index.zig");

const exe0 = b.addExecutable("exe0", "src/exe0/main.zig");

exe0.linkLibrary(lib0);
exe0.linkLibrary(lib1);

const exe1 = b.addExecutable("exe1", "src/exe1/main.zig");
exe1.linkLibrary(lib1);

这是一个好方法吗?是否可以在单独的文件中描述 exe 和 lib?在这种情况下,你如何链接它们?

编辑:我想我真的不需要静态库,实际上可以使用包。我猜这会更像曲折。不过,我仍然对静态库方法感兴趣。

4

1 回答 1

2

为了能够使用静态库方法,您需要明确设计整个公共接口以使用 C ABI。这是相当严格的(例如,你甚至不能直接在 API 边界使用切片),如果你没有从这种做法中获得任何其他好处,你应该使用包,或者更简单地说,只@import()使用文件相对路径。

关于拆分 build.zig 文件:如果您愿意,可以在每个项目中创建构建器函数,以便每个项目都可以定义自己的详细信息,如果您真的愿意的话。不过,我还没有看到人们在野外这样做。

如果您想要一个强大的 build.zig 文件示例,该文件将一些依赖关系联系在一起,请查看 Zig showdown: https ://github.com/zig-community/Zig-Showdown

于 2021-07-15T19:38:10.733 回答