具有多个 exe 和 lib 的 zig 项目
zig project with multiple exes and libs
我想设置一个 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?在那种情况下,你如何 link 他们?
编辑:我想我真的不需要静态库,实际上可以使用包来代替。我猜这会更像锯齿形。不过,我仍然对静态库方法感兴趣。
为了能够使用静态库方法,您需要明确设计整个 public 接口以使用 C ABI。这是非常严格的(例如,您甚至不能直接在 API 边界使用切片)并且如果您没有以某种方式从这种做法中获得任何其他好处,您应该使用包,或者更简单地说,只是@import()
使用相对路径的文件。
关于拆分 build.zig 文件:如果您愿意,可以在每个项目中创建构建器函数,以便每个项目都可以定义自己的详细信息(如果您确实需要的话)。不过,我还没有看到人们在野外这样做。
如果您想要一个将一些依赖关系联系在一起的强大 build.zig 文件的示例,请查看 Zig showdown:
https://github.com/zig-community/Zig-Showdown
我想设置一个 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?在那种情况下,你如何 link 他们?
编辑:我想我真的不需要静态库,实际上可以使用包来代替。我猜这会更像锯齿形。不过,我仍然对静态库方法感兴趣。
为了能够使用静态库方法,您需要明确设计整个 public 接口以使用 C ABI。这是非常严格的(例如,您甚至不能直接在 API 边界使用切片)并且如果您没有以某种方式从这种做法中获得任何其他好处,您应该使用包,或者更简单地说,只是@import()
使用相对路径的文件。
关于拆分 build.zig 文件:如果您愿意,可以在每个项目中创建构建器函数,以便每个项目都可以定义自己的详细信息(如果您确实需要的话)。不过,我还没有看到人们在野外这样做。
如果您想要一个将一些依赖关系联系在一起的强大 build.zig 文件的示例,请查看 Zig showdown: https://github.com/zig-community/Zig-Showdown