如何使用 gcc 在 windows 上使用 zlib 进行编译?

How do I compile with zlib on windows using gcc?

我的目标是将 zlib 与我的应用程序文件一起编译,我使用来自 tdm-gcc 的 gcc 并克隆了存储库 https://github.com/madler/zlib

/example 中有一个 zpipe.c 文件利用了这个库,但我似乎无法得到它在 windows.

上编译

我在编译命令的末尾添加了 -lz,但收到 /x86_64-w64-mingw32/bin/ld.exe: cannot find -lz 错误。

如果我尝试仅使用 -Izlib 进行编译,我最终会遇到以下错误:

$ gcc -Izlib zpipe.c -o zpipe
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\[redacted]\AppData\Local\Temp\ccjXicsi.o:zpipe.c:(.text+0x6a): undefined reference to `deflateInit_'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\[redacted]\AppData\Local\Temp\ccjXicsi.o:zpipe.c:(.text+0xca): undefined reference to `deflateEnd'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\[redacted]\AppData\Local\Temp\ccjXicsi.o:zpipe.c:(.text+0x12e): undefined reference to `deflate'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\[redacted]\AppData\Local\Temp\ccjXicsi.o:zpipe.c:(.text+0x1be): undefined reference to `deflateEnd'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\[redacted]\AppData\Local\Temp\ccjXicsi.o:zpipe.c:(.text+0x23c): undefined reference to `deflateEnd'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\[redacted]\AppData\Local\Temp\ccjXicsi.o:zpipe.c:(.text+0x2c0): undefined reference to `inflateInit_'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\[redacted]\AppData\Local\Temp\ccjXicsi.o:zpipe.c:(.text+0x320): undefined reference to `inflateEnd'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\[redacted]\AppData\Local\Temp\ccjXicsi.o:zpipe.c:(.text+0x36f): undefined reference to `inflate'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\[redacted]\AppData\Local\Temp\ccjXicsi.o:zpipe.c:(.text+0x3d1): undefined reference to `inflateEnd'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\[redacted]\AppData\Local\Temp\ccjXicsi.o:zpipe.c:(.text+0x440): undefined reference to `inflateEnd'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\[redacted]\AppData\Local\Temp\ccjXicsi.o:zpipe.c:(.text+0x474): undefined reference to `inflateEnd'
collect2.exe: error: ld returned 1 exit status

非常感谢任何帮助!我搜索了堆栈溢出并尝试了所有建议,还进行了谷歌搜索,但我仍然遇到问题。

这些错误看起来微不足道,我过去曾修复过此类错误,但我一直坚持这个错误,我不确定还能尝试什么。

1) 创建静态库。

.c.h 文件所在的 zlib 文件夹内 运行 gcc -c *.c 将生成可用于构建库的 .o 文件。

在您拥有 .o 文件后,运行 ar -rc libz.a *.o 将生成一个 libz.a 文件,这将允许您通过 -lz

link

2) 将zpipe.c编译成zpipe.exe

zpipe.c放到libz.a所在的文件夹里,编译时为了简单

运行 gcc -L. zpipe.c -o zpipe.exe -lz 将创建 zpipe.exe.

3) 快速演示

创建一个文件 hello.txt,里面有 Hello World!

运行 ./zpipe.exe < hello.txt > output.txt 这将膨胀 hello.txt 中的数据并将其放入 output.txt

运行./zpipe.exe -d < output.txt > original.txt解压后在original.txt[=61里面可以看到Hello World! =]

定义

-L. 告诉 gcc 使用当前文件夹作为头文件。

-lz 告诉 gcc 使用名称以 lib 开头并以 .a 结尾的静态库进行编译,例如. libexample.a 将是 -lexample

使用MSYS2 shell时非常简单,只需运行以下命令(将/usr/local替换为所需位置):

INSTALLPREFIX=/usr/local
wget -c http://www.zlib.net/zlib-1.2.12.tar.gz
tar xfz zlib-1.2.12.tar.gz
cd zlib-1.2.12
make -f win32/Makefile.gcc install \
 SHARED_MODE=1 \
 INCLUDE_PATH=$INSTALLPREFIX/include \
 LIBRARY_PATH=$INSTALLPREFIX/lib \
 BINARY_PATH=$INSTALLPREFIX/bin