zlib1.2.11的VS2019动态库静态库命令行编译

简介

zlib是提供数据压缩用的函式库,由Jean-loup Gailly与Mark Adler所开发。使用时一般编译为库,根据需求可能有四种组合,即Debug-32位、Debug-64位、Release-32位、Release-64位。

目标

编译出以上四种库并简单测试。

阅读基础

  • 了解VS的使用

快速阅读

了解的部分跳过。

环境说明

  • 操作系统:Windows10-64bit
  • VS版本:VS2019
  • zlib版本:zlib1.2.11

相关软件介绍

VS

Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台,包括[Microsoft Windows](https://baike.baidu.com/item/Microsoft Windows)、[Windows Mobile](https://baike.baidu.com/item/Windows Mobile/749381)、[Windows CE](https://baike.baidu.com/item/Windows CE)、[.NET Framework](https://baike.baidu.com/item/.NET Framework)、[.NET Compact Framework](https://baike.baidu.com/item/.NET Compact Framework/1926409)和Microsoft Silverlight 及[Windows Phone](https://baike.baidu.com/item/Windows Phone/9227600)。

Visual Studio是最流行的Windows平台应用程序的集成开发环境。最新版本为 Visual Studio 2019 版本,基于.NET Framework 4.8 。

2021年4月19日,微软宣布2021年夏季发布 Visual Studio 2022 的首个预览版。

2021年6月17日,首个预览版 Visual Studio 2022 Preview 1 正式发布 ,并且首次发布64位版本。

zlib

今天,zlib是一种事实上的业界标准,以至于在标准文档中,zlib和DEFLATE常常互换使用。数以千计的应用程序直接或间接依靠zlib压缩函式库,包括:

  • Linux核心:使用zlib以实作网络协定的压缩、档案系统的压缩以及开机时解压缩自身的核心
  • libpng,用于PNG图形格式的一个实现,对bitmap数据规定了DEFLATE作为流压缩方法
  • Apache:使用zlib实作http 1.1
  • OpenSSH、OpenSSL:以zlib达到最佳化加密网络传输
  • FFmpeg:以zlib读写Matroska等以DEFLATE算法压缩的多媒体串流格式
  • rsync:以zlib最佳化远端同步时的传输
  • dpkg和RPM软件包管理器,使用zlib从压缩软件包中解压文件
  • Subversion 、Git和 CVS 版本控制 系统,使用zlib来压缩和远端仓库的通讯流量
  • dpkg和RPM等包管理软件:以zlib解压缩RPM或者其他封包

因为其代码的可移植性,宽松的许可以及较小的内存占用,zlib在许多嵌入式设备中也有应用。

软件下载安装配置

VS2019

下载安装配置参考:VS2019+Qt5.15开发环境搭建_心飞的博客-CSDN博客

zlib

zlib的所有版本官网下载

zlib的所有libpng版本官网下载

zlib1.2.11官网下载

点击链接zlib1.2.11官网下载进入zlib官网下载,本文编写时最新版时zlib1.2.11。如下图:

BlogImage-20210827110206

找到下载链接–》点击下载。提供了三种压缩包,根据需求下载。如下图:

BlogImage-20210827110617

下载成功!如下图:

BlogImage-20210827110808

新建一个文件夹zlib1211并在其中解压zlib1.2.11。如下图:

BlogImage-20210827111151

准备工作完成。

VS2019命令行工具编译

准备工作

制作Makefile_release.msc文件

找到xxx`zlib-1.2.11\win32\Makefile.msc文件并复制一份,并更名为xxx\zlib-1.2.11\win32\Makefile_release.msc`。如下图:

BlogImage-20210830143912

Makefile.msc中的TOP = .改为TOP = ..;去掉CFLAGS中的-MD-Oy-选项。

BlogImage-20210830143826

修改Makefile.msc

找到路径xxx\zlib-1.2.11\win32下的Makefile.msc文件。如下图:

BlogImage-20210830143212

Makefile.msc中的TOP = .改为TOP = ..;去掉CFLAGS中的-MD选项。如下图:

BlogImage-20210830143423

xxx\zlib-1.2.11\win32\Makefile.msc文件内LDFLAGS = -nologo -debug -incremental:no -opt:ref中的-incremental:no -opt:ref去掉。

BlogImage-20210830144153

编译Debug-32位

打开32位命令行工具

从开始菜单找到32位的命令行工具。如下图:

BlogImage-20210828113212

编译.obj文件

复制zlib1.2.11的bld_ml32.bat所在目录的路径。如下图:

BlogImage-20210830111658

进入zlib1.2.11的bld_ml64.bat所在目录的路径。我的是:cd /d G:\zlib\zlib1211\zlib-1.2.11\contrib\masmx86如下图:

BlogImage-20210830111936

输入命令bld_ml32.bat生成.obj文件。

BlogImage-20210830112007

成功生成match686.obj、inffasx32.obj文件。

BlogImage-20210830112040

编译32位动态库和静态库(use ASM code, x86)

复制zlib1.2.11解压文件所在目录的路径。如下图:

BlogImage-20210830182713

在命令行工具中进入,zlib1.2.11解压文件所在目录。我的命令是:

cd /d G:\zlib\zlib1211\zlib-1.2.11

如下图:

BlogImage-20210830182933

zlib-1.2.11中创建文件夹zlib-1.2.11-bld-debug-msvc32,存放临时文件。如下图:

BlogImage-20210830170759

进入这个目录中。如下图:

BlogImage-20210830171301

输入以下命令编译:

BlogImage-20210830170759

通过命令行进入此目录。如下图:

BlogImage-20210830152641

输入以下命令编译:

nmake -f ../win32/Makefile.msc LOC="-DASMV -DASMINF -I.." OBJA="inffas32.obj match686.obj" all//生成所有文件
nmake -f ../win32/Makefile.msc LOC="-DASMV -DASMINF -I.." OBJA="inffas32.obj match686.obj" test//生成test
nmake -f ../win32/Makefile.msc LOC="-DASMV -DASMINF -I.." OBJA="inffas32.obj match686.obj" testdll//生成testdll

如果出现以下问题是之前编译生成的obj文件。如下图:

BlogImage-20210830171624

输入 del *.obj 执行删除目录下的所有obj文件。如下图:

BlogImage-20210828120047

成功编译64位动态库和静态库

再次输入命令编译。成功编译出静态库、动态库、导入库。

BlogImage-20210830183817

制作库模块

将动态库、静态库和头文件复制出来备用。

建立另一个空目录zlib-1.2.11-bld-debug-msvc32,在其下再建立四个空目录bin、include、lib、share如下图:

BlogImage-20210830172040

复制生成的的动态链接库zlib1.dll对应的导入库zdll.lib以及zlib.pdbshare目录中保存。如下图:

BlogImage-20210830173525

在share目录下新建空目录manpkgconfig,将xxx\zlib-1.2.11中的zlib.3zlib.pc.in分别复制到manpkgconfig中,zlib.pc.in改名为zlib.pc。如下图:

BlogImage-20210830173112

复制生成的zlib.liblib.pdblib目录中保存。如下图:

BlogImage-20210830173421

复制zlib-1.2.11中的头文件zconf.h、zlib.hinclude目录中保存。如下图:

BlogImage-20210830173637

功能测试

见Zlib库使用测试对应的版本。

编译Release-32位

打开32位命令行工具

从开始菜单找到32位的命令行工具。如下图:

BlogImage-20210828113212

编译.obj文件

复制zlib1.2.11的bld_ml32.bat所在目录的路径。如下图:

BlogImage-20210830111658

进入zlib1.2.11的bld_ml64.bat所在目录的路径。我的是:cd /d G:\zlib\zlib1211\zlib-1.2.11\contrib\masmx86如下图:

BlogImage-20210830111936

输入命令bld_ml32.bat生成.obj文件。

BlogImage-20210830112007

成功生成match686.obj、inffasx32.obj文件。

BlogImage-20210830112040

编译32位动态库和静态库(use ASM code, x86)

复制zlib1.2.11解压文件所在目录的路径。如下图:

BlogImage-20210830182713

在命令行工具中进入,zlib1.2.11解压文件所在目录。我的命令是:

cd /d G:\zlib\zlib1211\zlib-1.2.11

如下图:

BlogImage-20210830182933

zlib-1.2.11中创建文件夹zlib-1.2.11-bld-release-msvc32,存放临时文件。如下图:

BlogImage-20210830180357

进入这个目录中。如下图:

BlogImage-20210830180433

输入以下命令编译:

nmake -f ../win32/Makefile_release.msc LOC="-DASMV -DASMINF -I.." OBJA="inffas32.obj match686.obj" all//生成所有文件
nmake -f ../win32/Makefile_release.msc LOC="-DASMV -DASMINF -I.." OBJA="inffas32.obj match686.obj" test//生成test
nmake -f ../win32/Makefile_release.msc LOC="-DASMV -DASMINF -I.." OBJA="inffas32.obj match686.obj" testdll//生成testdll
  

如果出现以下问题是之前编译生成的obj文件。如下图:

BlogImage-20210830171624

输入 del *.obj 执行删除目录下的所有obj文件。如下图:

BlogImage-20210828120047

成功编译64位动态库和静态库

再次输入命令编译。成功编译出静态库、动态库、导入库。

BlogImage-20210830180707

制作库模块

将动态库、静态库和头文件复制出来备用。

建立另一个空目录zlib-1.2.11-bld-release-msvc32,在其下再建立四个空目录bin、include、lib、share如下图:

BlogImage-20210830180832

复制生成的的动态链接库zlib1.dll对应的导入库zdll.lib以及zlib.pdbshare目录中保存。如下图:

BlogImage-20210830181047

在share目录下新建空目录manpkgconfig,将xxx\zlib-1.2.11中的zlib.3zlib.pc.in分别复制到manpkgconfig中,zlib.pc.in改名为zlib.pc。如下图:

BlogImage-20210830181138

复制生成的zlib.liblib.pdblib目录中保存。如下图:

BlogImage-20210830181325

复制zlib-1.2.11中的头文件zconf.h、zlib.hinclude目录中保存。如下图:

BlogImage-20210830181508

功能测试

见Zlib库使用测试对应的版本。

编译Debug-64位

打开64位命令行工具

从开始菜单找到64位的命令行工具。如下图:

BlogImage-20210828113039

打开后如下图:

BlogImage-20210828113433

编译.obj文件

复制zlib1.2.11的bld_ml64.bat所在目录的路径。如下图:

BlogImage-20210828141045

进入zlib1.2.11的bld_ml64.bat所在目录的路径。我的是:cd /d G:\zlib\zlib1211\zlib-1.2.11\contrib\masmx64如下图:

BlogImage-20210830182136

输入命令bld_ml64.bat生成.obj文件。

BlogImage-20210830182228

成功生成gvmat64.obj、inffasx64.obj文件。

BlogImage-20210830182308

编译64位动态库和静态库(use ASM code, x64)

复制zlib1.2.11解压文件所在目录的路径。如下图:

BlogImage-20210830182713

在命令行工具中进入,zlib1.2.11解压文件所在目录。我的命令是:

cd /d G:\zlib\zlib1211\zlib-1.2.11

如下图:

BlogImage-20210830182933

zlib-1.2.11中创建文件夹zlib-1.2.11-bld-debug-msvc64,存放临时文件。如下图:

BlogImage-20210830183509

进入这个目录中。如下图:

BlogImage-20210830183531

输入以下命令编译:

nmake -f ../win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -I.." OBJA="inffasx64.obj gvmat64.obj inffas8664.obj" all//生成所有文件
nmake -f ../win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -I.." OBJA="inffasx64.obj gvmat64.obj inffas8664.obj" test//生成test
nmake -f ../win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -I.." OBJA="inffasx64.obj gvmat64.obj inffas8664.obj" testdll//生成testdll

解决 error LNK1112

如果输入以下命令编译报错inffasx64.obj:fatal error LNK1112:模块计算机类型“x64”与目标计算机类型“x86”冲突。如下图:

BlogImage-20210828145751

先删除之前编生成的obj文件,输入del *.obj 执行删除目录下的所有obj文件。

BlogImage-20210828150055

成功编译64位动态库和静态库

再次输入命令编译,成功编译出静态库、动态库、导入库。

BlogImage-20210830193525

制作库模块

将动态库、静态库和头文件复制出来备用。

建立目录zlib-1.2.11-debug-msvc64,在其下再建立四个空目录bin、include、lib、share如下图:

BlogImage-20210830193634

复制生成的**动态链接库zlib1.dll对应的导入库zdll.lib**到share目录中保存。如下图:

BlogImage-20210830193732

在share目录下新建空目录manpkgconfig,将xxx\zlib-1.2.11中的zlib.3zlib.pc.in分别复制到manpkgconfig中,zlib.pc.in改名为zlib.pc。如下图:

BlogImage-20210830193933

复制生成的**静态链接库zlib.lib**到lib目录中保存。如下图:

BlogImage-20210830194853

复制zlib-1.2.11中的头文件zconf.h、zlib.hinclude目录中保存。如下图:

BlogImage-20210830194937

功能测试

见Zlib库使用测试对应的版本。

编译Release-64位

打开64位命令行工具

从开始菜单找到64位的命令行工具。如下图:

BlogImage-20210828113039

打开后如下图:

BlogImage-20210828113433

编译.obj文件

复制zlib1.2.11的bld_ml64.bat所在目录的路径。如下图:

BlogImage-20210828141045

进入zlib1.2.11的bld_ml64.bat所在目录的路径。我的是:cd /d G:\zlib\zlib1211\zlib-1.2.11\contrib\masmx64如下图:

BlogImage-20210830182136

输入命令bld_ml64.bat生成.obj文件。

BlogImage-20210830182228

成功生成gvmat64.obj、inffasx64.obj文件。

BlogImage-20210830182308

编译64位动态库和静态库(use ASM code, x64)

复制zlib1.2.11解压文件所在目录的路径。如下图:

BlogImage-20210830182713

在命令行工具中进入,zlib1.2.11解压文件所在目录。我的命令是:

cd /d G:\zlib\zlib1211\zlib-1.2.11

如下图:

BlogImage-20210830182933

zlib-1.2.11中创建文件夹zlib-1.2.11-bld-debug-msvc64,存放临时文件。如下图:

BlogImage-20210830194246

进入这个目录中。如下图:

BlogImage-20210830194347

输入以下命令编译:

    nmake -f ../win32/Makefile_release.msc AS=ml64 LOC="-DASMV -DASMINF -I.." OBJA="inffasx64.obj gvmat64.obj inffas8664.obj" all//生成所有文件
nmake -f ../win32/Makefile_release.msc AS=ml64 LOC="-DASMV -DASMINF -I.." OBJA="inffasx64.obj gvmat64.obj inffas8664.obj" test//生成test
nmake -f ../win32/Makefile_release.msc AS=ml64 LOC="-DASMV -DASMINF -I.." OBJA="inffasx64.obj gvmat64.obj inffas8664.obj" testdll//生成testdll

解决 error LNK1112

如果输入以下命令编译报错inffasx64.obj:fatal error LNK1112:模块计算机类型“x64”与目标计算机类型“x86”冲突。如下图:

BlogImage-20210828145751

先删除之前编生成的obj文件,输入del *.obj 执行删除目录下的所有obj文件。

BlogImage-20210828150055

成功编译64位动态库和静态库

再次输入命令编译,成功编译出静态库、动态库、导入库。

BlogImage-20210830193525

制作库模块

将动态库、静态库和头文件复制出来备用。

建立目录zlib-1.2.11-release-msvc64,在其下再建立四个空目录bin、include、lib、share如下图:

BlogImage-20210830195344

复制生成的**动态链接库zlib1.dll对应的导入库zdll.lib**到share目录中保存。如下图:

BlogImage-20210830195405

在share目录下新建空目录manpkgconfig,将xxx\zlib-1.2.11中的zlib.3zlib.pc.in分别复制到manpkgconfig中,zlib.pc.in改名为zlib.pc。如下图:

BlogImage-20210830195443

复制生成的**静态链接库zlib.lib**到lib目录中保存。如下图:

BlogImage-20210830195516

复制zlib-1.2.11中的头文件zconf.h、zlib.hinclude目录中保存。如下图:

BlogImage-20210830195537

功能测试

见Zlib库使用测试对应的版本。

Zlib库使用测试

创建一个控制台应用测试编译的zlib库是否能够正常使用。

Debug-64位测试

在VS中使用静态库zlibstat.lib

创建项目

开始–》找到VS2019–》打开VS2019–》创建新项目。如下图:

BlogImage-20210827150850

点击控制台应用–》下一步。如下图:

BlogImage-20210827151120

配置项目。如下图:

BlogImage-20210827151312

将前面制作的库模块zlib-1.2.11-debug-msvc64复制到工程文件夹,内含Debug-64位静态库、动态库、头文件。如下图:

BlogImage-20210830195833

切换到刚创建的VS工程点击解决方案资源管理器中的显示所有文件,发现zlib-1.2.11-bld-debug-msvc64已经包含在工程中了。如下图:

BlogImage-20210830195932

设置Debug-64位编译

设置编译模式为Debug-64位。如下图:

BlogImage-20210827152300

添加zlib库文件

添加include头文件,在当前解决方案上右键–》属性–》C/C++–>常规–》附加库目录–》添加路径,添加各种信息(都不用带分号,直接添加)。如下图:

BlogImage-20210830200229

添加lib静态库文件,在当前解决方案上右键–》属性–》链接器–>常规–》附加库目录–》添加路径,添加各种信息(都不用带分号,直接添加)。如下图:

BlogImage-20210830200437

添加lib静态库文件,在当前解决方案上右键–》属性–》链接器–>输入–》附加依赖项–》添加路径,添加各种信息(都不用带分号,直接添加)。如下图:

BlogImage-20210830200554

添加lib静态库文件,在当前解决方案上右键–》属性–》C/C++–>预处理器–》预处理器定义–》添加路径,添加各种信息(都不用带分号,直接添加)。如下图:

BlogImage-20210830200704

都设置好后先点击应用–》再点击确定。如下图:

BlogImage-20210827154045

运行测试

编写简单测试代码。

#include <iostream>
#include <stdlib.h>
#include <string>
#include <zlib.h>
#include <zconf.h>

using namespace std;

int main(int argc, char* argv[]) {
    
    
 unsigned char szSrc[] = "test the compression and uncompression of zlib.";
 unsigned long nSrcLen = sizeof(szSrc);
 unsigned char szZip[1024] = {
    
     0 };
 unsigned long nZipLen = 1024;
 compress(szZip, &nZipLen, szSrc, nSrcLen);
 unsigned char szUnZip[1024] = {
    
     0 };
 unsigned long nUnZipLen = 1024;
 uncompress(szUnZip, &nUnZipLen, szZip, nZipLen);
 cout << "Src:" << szSrc << ", len:" << nSrcLen << endl;
 cout << "Zip:" << szZip << ", len:" << nZipLen << endl;
 cout << "UnZip:" << szUnZip << ", len:" << nUnZipLen << endl;
 system("pause");
 return 0;
}

如下图:

BlogImage-20210827154228

生成–》生成解决方案,编译代码成功。如下图:

BlogImage-20210827154447

调试–》开始执行(不调试)执行代码成功。如下图:

BlogImage-20210827154658

Release-64位测试

仍然使用前面创建的项目,这次使用动态库zlibwapi.lib,只需要做一点修改。

复制库文件到项目

将前面制作的库模块zlib-1.2.11-debug-msvc64复制到工程文件夹,内含Release-64位静态库、动态库、头文件。如下图:

BlogImage-20210830202345

设置Release-64位编译

设置编译模式为Release-64位。如下图:

BlogImage-20210827160333

添加zlib库文件

添加share动态态库文件,参考上文的方法。

上面的include、share、.lib、ZLIB_WINAPI添加完成即可运行。

运行测试

生成–》生成解决方案,编译代码成功。如下图:

BlogImage-20210827162105

调试–》开始执行(不调试)执行代码成功。如下图:

BlogImage-20210827162145

Debug-32位测试

仍然使用前面创建的项目,这次使用静态库zlibstat.lib,只需要做一点修改。

复制库文件到项目

将前面制作的库模块zlib-1.2.11-debug-msvc32复制到工程文件夹,内含Debug-32位静态库、动态库、头文件。如下图:

BlogImage-20210830202426

设置Debug-32位编译

设置编译模式为Debug-32位。如下图:

BlogImage-20210827172343

添加zlib库文件

添加share静态库文件,参考上文的方法。

上面的include、lib、.lib添加完成后,即可编译。不用加ZLIB_WINAPI预编译。

运行测试

生成–》生成解决方案,编译代码成功。如下图:

BlogImage-20210827172434

调试–》开始执行(不调试)执行代码成功。如下图:

BlogImage-20210827172509

Release-32位测试

仍然使用前面创建的项目,这次使用动态库zlibwapi.lib,只需要做一点修改。

复制库文件到项目

将前面制作的库模块zlib-1.2.11-debug-msvc64复制到工程文件夹,内含Release-32位静态库、动态库、头文件。如下图:

BlogImage-20210830202504

设置Release-32位编译

设置编译模式为Rlease-32位。如下图:

BlogImage-20210827175425

添加zlib库文件

添加share静态库文件,参考上文的方法。

上面的include、share、.lib添加完成后,不用加ZLIB_WINAPI预编译。还需要将zlib1.dll引导库添加到工程根目录下。如下图:

BlogImage-20210831100800

运行测试

生成–》生成解决方案,编译代码成功。如下图:

BlogImage-20210827175623

调试–》开始执行(不调试)执行代码成功。如下图:

BlogImage-20210827181129

其他

编译完成后的库下载

zlib1.2.11VS2019命令行bld编译四种库.rar-C文档类资源-CSDN下载

最近更新

查看本文最近更新请点击

欢迎关注微信公众号

weixingognzhonghaoerweima

猜你喜欢

转载自blog.csdn.net/aa1319594154/article/details/120012017