登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> CLQ工作室开源代码 >> 主题: [zig]Zig学习篇|zig生成和调用静态库与动态库 [zt]     [回主站]     [分站链接]
标题
[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文件。



总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1