I am playing with nim FFI (newbie speaking). I am trying to wrap minizip for the sake of learning a bit. I have minizip installed under ArchLinux.
What I have so far is:
#proc fmi_zip_unzip*(zip_file_path: cstring; output_folder: cstring;
# callbacks: ptr jm_callbacks): jm_status_enu_t
#int unzip(const char *zipfilename, const char *dirname);
{.deadCodeElim: on.}
const libname = "/usr/lib/libminizip.so"
#type
# unzFile* = pointer
{.passl: gorge("pkg-config --cflags minizip") .}
{.passc: gorge("pkg-config --cflags minizip") .}
#{.push importc.}
#{.push header:"unzip.h"}
{.push dynlib:libname.}
#unzFile ZEXPORT unzOpen64 OF((const void *path));
#proc unzOpen64*(zipfilename: cstring): pointer #{.header:"<minizip-master/include/miniunz.h>".}
proc unzOpen64*(zipfilename: cstring): pointer {.header:"unzip.h" importc:"unzOpen64"}
{.pop.} # dynlib
#{.pop.}
#{.pop.} # importc
#var error:cint
#var uf:unzFile
var uf = unzOpen64("./test.zip")
And what I get is:
$ nim c -r minizip2.nim .... minizip2.nim.c:(.text+0x20e): referencia a `unzOpen64' sin definir collect2: error: ld devolvió el estado de salida 1 ....
Which means something like unzOpen64 is a reference without a definition.
Any clue about what am I doing wrong?
Kind regards, José M.
This line looks wrong, should be --libs.
{.passl: gorge("pkg-config --cflags minizip") .}
Also header pragma is not required for C interop as long as you define the function signatures correctly.That worked. Thanks mate.
For the record:
{.deadCodeElim: on.}
{.passl: gorge("pkg-config --libs minizip") .}
{.passc: gorge("pkg-config --cflags minizip") .}
proc unzOpen64*(zipfilename: cstring): pointer {. importc:"unzOpen64"}
var uf = unzOpen64("./test.zip")