On both Linux and Windows nimble list -i's output includes: zip [0.2.1].
On Linux the program listed below compiles & runs & lists a zip file.
On Windows I just get error messages (shown after the program).
nzip.nim
{.experimental: "codeReordering".}
import os
import strformat
import strutils
import unicode
import zip/zipfiles
type Action = enum actCreate, actExtract, actList
main()
proc main() =
let (action, infilename, files) = readCommandLine() # May not return
case action
of actCreate: echo("TODO create")
of actExtract: echo("TODO extract")
of actList: listFiles(infilename)
proc readCommandLine(): (Action, string, seq[string]) =
var action = actList
var infilename = ""
var files = newSeq[string]()
let args = commandLineParams()
if len(args) == 0 or args[0] == "-h" or args[0] == "--help":
echo(&"usage: {lastPathPart(getAppFilename())} " &
"[-c|--create] " &
"[-e|-x|--extract] " &
"[-l|-t|--list] file.zip <file(s)>\n" &
"(Hyphen prefixes are not required.)")
quit()
for arg in args:
case arg
of "c", "-c", "--create", "create": action = actCreate
of "l", "t", "-l", "-t", "--list", "list": action = actList
of "e", "x", "-e", "-x", "--extract", "extract": action = actExtract
else:
if infilename == "" and arg.toLower().endsWith(".zip"):
infilename = arg
else:
files.add(arg)
(action, infilename, files)
proc listFiles(infilename: string) =
var archive: ZipArchive
if open(archive, infilename):
defer: archive.close()
for name in archive.walkFiles():
echo(name)
else:
echo(&"failed to open \"{infilename}\"")
Errors on Windows:
Hint: used config file 'C:\bin\nim\config\nim.cfg' [Conf]
R:\nim\nzip\nzip.nim(18, 28) Hint: 'files' is declared but not used [XDeclaredButNotUsed]
Hint: [Link]
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x2c3): undefined reference to `crc32'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x33e): undefined reference to `deflateInit2_'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x366): undefined reference to `deflate'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x416): undefined reference to `crc32'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x426): undefined reference to `deflateEnd'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x4c1): undefined reference to `deflateEnd'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x16f4): undefined reference to `zError'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x371f): undefined reference to `zError'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x37c3): undefined reference to `inflateEnd'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x38a4): undefined reference to `crc32'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x38de): undefined reference to `crc32'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x39c5): undefined reference to `zError'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x3fc3): undefined reference to `crc32'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x406e): undefined reference to `inflateEnd'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x4250): undefined reference to `inflateInit2_'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x4270): undefined reference to `inflateEnd'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x431a): undefined reference to `inflateEnd'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x63c6): undefined reference to `inflate'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x6426): undefined reference to `crc32'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x6606): undefined reference to `crc32'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x670d): undefined reference to `inflateEnd'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x680f): undefined reference to `inflateEnd'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x6956): undefined reference to `inflate'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x69ad): undefined reference to `crc32'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x6b35): undefined reference to `crc32'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x6bd5): undefined reference to `zError'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x7199): undefined reference to `crc32'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x754c): undefined reference to `inflateInit2_'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x8de0): undefined reference to `crc32'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x8e90): undefined reference to `inflateEnd'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x9060): undefined reference to `inflateInit2_'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x9085): undefined reference to `inflateEnd'
C:\Users\mark\nimcache\nzip_r\libzip_all.c.o:libzip_all.c:(.text+0x9144): undefined reference to `inflateEnd'
collect2.exe: error: ld returned 1 exit status
Error: execution of an external program failed: 'C:\bin\nim\dist\mingw64\bin\gcc.exe -o R:\nim\nzip\nzip.exe C:\Users\mark\nimcache\nzip_r\libzip_all.c.o C:\Users\mark\nimcache\nzip_r\stdlib_assertions.nim.c.o C:\Users\mark\nimcache\nzip_r\stdlib_widestrs.nim.c.o C:\Users\mark\nimcache\nzip_r\stdlib_io.nim.c.o C:\Users\mark\nimcache\nzip_r\stdlib_system.nim.c.o C:\Users\mark\nimcache\nzip_r\stdlib_parseutils.nim.c.o C:\Users\mark\nimcache\nzip_r\stdlib_unicode.nim.c.o C:\Users\mark\nimcache\nzip_r\stdlib_strutils.nim.c.o C:\Users\mark\nimcache\nzip_r\stdlib_dynlib.nim.c.o C:\Users\mark\nimcache\nzip_r\stdlib_winlean.nim.c.o C:\Users\mark\nimcache\nzip_r\stdlib_times.nim.c.o C:\Users\mark\nimcache\nzip_r\stdlib_os.nim.c.o C:\Users\mark\nimcache\nzip_r\stdlib_strformat.nim.c.o C:\Users\mark\nimcache\nzip_r\@m..@s..@s..@sC@c@sUsers@[email protected]@[email protected]@[email protected] C:\Users\mark\nimcache\nzip_r\@m..@s..@s..@sC@c@sUsers@[email protected]@[email protected]@[email protected] C:\Users\mark\nimcache\nzip_r\@mnzip.nim.c.o '
Can anyone advise how I can get this to work on Windows as well as Linux?That link is helpful, thank you. For anyone else who hits this, I added these two lines after the imports:
when defined(windows):
{.passl: "-lz".}
It now compiles & runs & lists zip contents on Windows and Linux. And the executable doesn't seem to depend on any separate shared libs, so is conveniently stand-alone.