标题
[zig]Zig学习篇|zig生成和调用静态库与动态库 [zt]
clq
浏览(434) +
2022-12-23 17:14:46 发表
编辑
关键字:
https://zhuanlan.zhihu.com/p/457791672 Zig学习篇|zig生成和调用静态库与动态库 yalight yalight 东北大学秦皇岛分校 教师 生成静态库 以windows系统为例,在命令行终端下用如下命令生成静态库: zig init-lib 在当前目录下生成两个文件 build.zig src/main.zig main.zig const std = @import("std"); const testing = std.testing; export fn add(a: i32, b: i32) i32 { return a + b; } test "basic add functionality" { try testing.expect(add(3, 7) == 10); } 关键字export声明了一个暴露给外部调用的函数add(). build.zig const std = @import("std"); pub fn build(b: *std.build.Builder) void { // Standard release options allow the person running `zig build` to select // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. const mode = b.standardReleaseOptions(); const lib = b.addStaticLibrary("st", "src/main.zig"); lib.setBuildMode(mode); lib.install(); const main_tests = b.addTest("src/main.zig"); main_tests.setBuildMode(mode); const test_step = b.step("test", "Run library tests"); test_step.dependOn(&main_tests.step); } 下面的语句表示添加一个静态库st(实际名称是st.lib).该库来自main.zig源文件。 const lib = b.addStaticLibrary("st", "src/main.zig"); 在命令行终端下执行 zig build 可看到在zig-out/lib中生成了一个静态库 st.lib 生成动态库 如何构建动态库呢? 在build.zig中修改下面的语句 const lib = b.addStaticLibrary("st", "src/main.zig"); 改为 const lib = b.addSharedLibrary("st","src/main.zig",std.build.LibExeObjStep.SharedLibKind{.unversioned = undefined}); 即可生成dll动态库和对应的lib文件。 或者直接用如下命令生成动态库 zig build-lib st.zig -dynamic 调用静态或动态库 例程: src/main.zig const std = @import("std"); extern fn add(a: i32, b: i32) i32; pub fn main() anyerror!void { std.debug.print("{d}",.{add(1,2)}); } test "basic test" { try std.testing.expectEqual(10, 3 + 7); } 在程序中,要调用的外部函数用extern声明。 build.zig const std = @import("std"); pub fn build(b: *std.build.Builder) void { const target = b.standardTargetOptions(.{}); // Standard release options allow the person running `zig build` to select // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. const mode = b.standardReleaseOptions(); const exe = b.addExecutable("main", "src/main.zig"); exe.setTarget(target); exe.setBuildMode(mode); exe.addLibPath("."); exe.linkSystemLibrary("st"); exe.install(); const run_cmd = exe.run(); run_cmd.step.dependOn(b.getInstallStep()); if (b.args) |args| { run_cmd.addArgs(args); } const run_step = b.step("run", "Run the app"); run_step.dependOn(&run_cmd.step); const exe_tests = b.addTest("src/main.zig"); exe_tests.setTarget(target); exe_tests.setBuildMode(mode); const test_step = b.step("test", "Run unit tests"); test_step.dependOn(&exe_tests.step); } 其中, exe.addLibPath("."); 设置zig编译器寻找lib的路径,相当于标志-L exe.linkSystemLibrary("st"); 寻找st的库lib,相当于编译器标志-l。 执行如下命令即可运行: zig build run 根据dll生成lib 一般情况下,zig是调用的lib,再去调用dll动态库。如果只有dll没有lib,则要构建一个lib。 在windows x64下面,构建lib要用到vc工具dumpbin.在microsoft visual studio 下面可以找到,如: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin 下面 步骤是先用dumpbin生成dll对应的def,修改def,然后根据def生成lib。 如对于st.dll,采用如下命令生成def: dumpbin /exports st.dll > st.def 修改st.def LIBRARY EXPORTS add 然后执行命令 lib /def:st.def /machine:x64 /out:st.lib 即可生成lib文件。
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.