This my first time using zig and zigler.
I am trying to use the embedded library for wireguard.
I have in the same folder, wireguard.h
, wireguard.c
and wireguard.ex
.
The Wireguard
module has
defmodule Wireguard do
use Zig,
otp_ap: :wg_man,
c_src: [{"wireguard.c", ["-Wall"]}],
include_dir: "."
~Z"""
const std = @import("std");
const crypto = std.crypto;
const log = std.log.scoped(.wireguard);
const wireguard = @cImport({
@cInclude("wireguard.h");
});
pub fn list_devices() void {
var deviceNames: [*c]u8 = null;
deviceNames = wireguard.wg_list_device_names() orelse null;
defer std.c.free(@ptrCast(?*anyopaque, deviceNames));
if (deviceNames == null) {
log.err("Unable to get device names", .{});
return;
}
}
"""
When I try to mix compile
, I get the following error:
== Compilation error in file lib/wireguard/wireguard.ex ==
** (MatchError) no match of right hand side value: ["error: ld.lld: undefined symbol: wg_list_device_names\n note: referenced by .Elixir.Wireguard.zig:13 (/home/herman/Projects/wg_man/lib/wireguard/.Elixir.Wireguard.zig:13)\n note: /home/herman/.cache/zig/o/f3cd82336c77b73ffaead67d9007ba46/sema.o:(.Elixir.Wireguard.list_devices)"]
(zigler 0.10.2) lib/zig/compile_error.ex:11: Zig.CompileError.to_error/2
(zigler 0.10.2) lib/zig/sema.ex:88: Zig.Sema.run_sema!/3
(zigler 0.10.2) lib/zig/compiler.ex:76: Zig.Compiler.compile/4
(zigler 0.10.2) expanding macro: Zig.Compiler.__before_compile__/1
lib/wireguard/wireguard.ex:1: Wireguard (module)
This function is defined in wireguard.c
, so why is it not being found?
If I remove the body from the zig function it compiles and when I look at the exported functions in the generated Elixir.Wireguard.so
I do find all the functions there.
I am probably missing something, but I have no clue where to start looking.