Windows下zlib库和libPng库的编译和使用_weixin_33858336的博客-程序员宅基地

技术标签: c/c++  

关于zlib库和libpng是干嘛的。我就不说了。度娘和谷歌都能告诉你。这里主要记录下windows下怎样利用vs2010编译和使用这两个库。

 

一、zlib库的编译

    首先要下载这个库,这个谷歌和百度也都能够找得到的。我下载的是zlib-1.2.5,下载完解压出来就可以。

下边就開始编译吧。

(包含动态库和静态库两种)

1. 首先开启VS2010的Command Prompt (32bit),也就是命令提示窗体。

2. 进入到zlib-1.2.5/contrib/masmx86文件夹。运行bld_ml32.bat。

(同理。64位的电脑进入masmx64文件夹,运行bld_ml64.bat)。这一步运行bld_ml32批处理文件,里面调用ml命令编译inffas32.asm和match686.asm。生成inffas32.obj和match686.obj(生成在本文件夹下)。这两个文件在zlibvc中用到。

3. zlib的vs sln解决方式文件能够在例如以下路径中找到:zlib-1.2.5/contrib/vstudio/vc10/zlibvc.sln。打开

   这个解决方式中包括6个project。

当中:

   (1). zlibvc生成动态链接库zlibwapi.dll和相应的导入库zlibwapi.lib

   (2). zlibstat生成静态链接库zlibstat.lib

   (3). testzlibdll測试生成的动态链接库zlibwapi.dll

   (4). testzlib測试生成的静态链接库zlibstat.lib        

   最后我们在debug模式下编译整个解决方式。生成的dll和lib文件可在对应的目录中找到。

 

下边介绍怎样使用编译好的动态或是静态库。(如果项目project已经建立完成)

这里我们把静态库zlibstat.lib和动态库(zlibwapi.dll/zlibwapi.lib)以及zlib.h/zlibconf.h文件放在一个目录中。

 

二、使用zlib静态库:zlibstat.lib

1. 包括头文件
    属性--C/C++--常规--附加包括文件夹(加入包括.h文件的文件夹)
2. 定义宏
    属性--C/C++--预处理器--预处理器定义:加入 ZLIB_WINAPI ASMV ASMINF
3. 项目包括.lib文件所在的文件夹:
    属性--链接器--常规--附加库文件夹
4. 项目包括.lib文件
    属性--链接器--输入--附加依赖项(libstat.lib)

5. 项目代码中 #include "zlib.h"
编译生成.exe就可以使用。

 

三、使用动态库 zlibwapi.lib

1. 包括头文件
    属性--C/C++--常规--附加包括文件夹(加入包括.h的文件夹)
2. 定义宏
    属性--C/C++--预处理器--预处理器定义:加入 ZLIB_WINAPI
3. 项目包括.lib文件所在的文件夹:
    属性--链接器--常规--附加库文件夹
4. 项目包括.lib文件
    属性--链接器--输入--附加依赖项(zlibwapi.lib)

5. 项目代码中 #include "zlib.h"
编译生成.exe文件须要.dll文件支持(动态载入)

 

四、libpng的编译

1. 首先要下载这个库,我下载的是 libpng-1.2.37。解压。

2. 这个的解决方式在 libpng-1.2.37/projects/visualc71中,打开 libpng.sln。用vs2010打开可能须要转换,点击下一步进行转换就可以。

3. 不要急着编译。首先分析这个解决方式:

    这个解决方式的libpng项目默认是採用的动态库(.dll)编译的(属性--配置属性--常规--项目默认类型)。我们能够直接编译静态库。生成.dll文件和.lib文件。

在编译的时候,可能会出错,反正就是各种错误,不是缺少这个就是缺少那个的,非常烦人。这里我本来就是想编译静态类型的,所以也就没在研究这个。

下边改为静态类型编译,这里有点麻烦。别着急。

4. 静态编译须要宏定义,我们首先打开项目属性--配置属性--C/C++--预处理器定义,这里我们看到动态编译时定义的一些宏。

这里有两个对我们实用:PNG_BUILD_DLL 和 ZLIB_DLL。

5. 在整个解决方式中查找PNG_BUILD_DLL。我们能够在pngconf.h文件里看到下边一段代码:

Normal' png-on-win32 defines/defaults:
PNG_BUILD_DLL -- building dll
PNG_USE_DLL   -- building an application, linking to dll
(no define)   -- building static library, or building an
                 application and linking to the static lib

这里能够非常明显的看出,假设我们须要编译静态库,则须要 no define.所以我们删除 PNG_BUILD_DLL 宏定义。

6. 在整个解决方式中查找 ZLIB_DLL,我们会找到下边一句话:

If building or using zlib as a DLL, define ZLIB_DLL

这里仅仅是告诉我们。假设我们把zlib作为dll使用。则定义ZLIB_DLL。可是我们这里不希望这么做,所以继续分析。下边还有几句话:

If building or using zlib with the WINAPI/WINAPIV calling convention,
define ZLIB_WINAPI.
Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.

这段英文看的不是特别懂,可是能知道,我们定义ZLIB_WINAPI就可以。这个我们在上边的zlib静态库的编译中也用到了,所以,应该就是这么定义了。

我们在“预处理器定义”中删除ZLIB_DLL,改为 ZLIB_WINAPI。

7. 宏定义完了,还须要最关键的一步,我们在 属性--配置属性--常规--项目默认类型中更改为“静态库(.lib)。编译选项改为LIB Debug。编译生成就可以。

生成的文件为libpngd.lib。

 

下边介绍怎样使用编译好的静态库。

(如果项目project已经建立完成)

这里我们把静态库 libpngd.lib 和 png.h/pngconf.h 文件放在一个目录中。

 

五、libpng静态库(libpngd.lib)的使用。

1. 包括头文件
    属性--C/C++--常规--附加包括文件夹(加入包括.h文件的文件夹)
2. 定义宏
    这里由于要用到zlib库,所以仅仅要定义ZLIB_WINAPI就可以

3. 项目包括.lib文件所在的文件夹:
    属性--链接器--常规--附加库文件夹
4. 项目包括.lib文件
    属性--链接器--输入--附加依赖项(libpngd.lib)

5. 项目代码中 #include "png.h"
编译生成.exe就可以使用。

 

注:在编译的时候,可能会出现下面警告:

warning LNK4099: 未找到 PDB“vc100.pdb”(......);正在链接对象。如同没有调试信息一样

这个不影响代码的执行。



參考 :

             zlib与libpng下载: http://olex.openlogic.com/packages/zlib/1.2.5                       http://sourceforge.net/projects/libpng/files/
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33858336/article/details/85791249

智能推荐

【Spring Security OAuth2笔记系列】- 【使用Spring MVC开发RESTful API】 用户信息修改和删除-程序员宅基地

用户信息修改和删除本节类容常用的验证注解自定义消息自定义校验注解常用的验证注解自己官网或则百度吧。 官网文档 http://hibernate.org/validator/documentation/ https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_sing...

sdf格式f数据库转换为db格式数据库-程序员宅基地

进行移动开发中使用的数据库转换为sqlserver数据库和sqlite数据库1.CE数据库转换为sqlserver数据库,使用工具(CompactView)打开sdf数据库,进行脚本导出,把脚本在sqlserver中执行,生成数据库。注:如果CE数据库版本为3.1,可能不能直接打开,会提示版本和程序集相关的错误代码。解决办法:使用sqlserver2008打开sdf数据库,如果sdf数

open-falcon(小米监控安装)_openfalcon安装及监控-程序员宅基地

安装官方文档:http://book.open-falcon.org按照步骤安装即可,但是要注意python的版本有台机子上安装完成后,在每台被监控的机子上装这个agent就可以了http://book.open-falcon.org/zh_0_2/distributed_install/agent.html..._openfalcon安装及监控

idea对象点方法出不来,rainbow Brackets插件彩虹括号无效,编译包报循环依赖_rainbow brackets不生效-程序员宅基地

idea对象点方法出不来,rainbow Brackets插件彩虹括号无效,编译包报循环依赖1.晚上编译代码的过程中突然xml文件中的一个类报红了,于是我就按照idea提示的点击导入相关包,结果后面报包循环依赖,怎么都编译不过去。后面经过寻找把循环依赖的包给删除了(右键dependencies中相关循环依赖的包进行删除)。2.编译的问题解决了。第二天早上我安装了几个idea插件,结果rain..._rainbow brackets不生效

Android MapBox使用之自定义Marker(二)-程序员宅基地

上一篇提到了可以通过MapBox的api实现对添加到地图上的marker进行放大缩小,本篇就来说下如何具体实现。继承MarkerView自定义MyMarkerViewpublic class MyMarkerView extends MarkerView{ /** *使用MarkerView的构建器创建MarkerView的实例 * * @param base...

系统分析与设计【作业一】_操作系统分析与设计实习-程序员宅基地

简答题软件工程的定义软件工程是指应用系统的,规范的,可量化的方法来开发,操作和维护软件,也即将工程方法应用于软件。对(1)所提到的方法的研究。对(1)所提到的方法的研究。解释导致 software crisis 本质原因、表现,述说克服软件危机的方法导致软件危机的本质原因软件危机是由于计算机能力的迅速增加以及无法解决的问题的复杂性导致的。计算能力的提高超过了程序员有效利..._操作系统分析与设计实习

随便推点

Android嵌套滑动冲突-程序员宅基地

android在嵌套滑动的时候会产生滑动冲突。之前我也碰到,但是以前的笔记本丢失了,所以只能重新再写一章。一.会产生滑动冲突的情况那么什么时候会产生滑动冲突呢?比如你有个activity,activity的上半部分是一个布局,下半部分是一个可滑动控件(RecyclerView、ListView等),或者下..._android 嵌套滑动冲突解决

MUI 实现手机图片上传_mui 图片上传-程序员宅基地

由于公司自主研发APP,使用的是MUI框架。我做了其中头像图片上传的功能,在此分享下demo;如有不规范处,请多多指教,互相学习。第一次接触这个框架,踩了许多的坑 >_<步骤:点击选择图片 → 图片转BASE64发送到服务器 → 服务器解码写入流中,返回地址1.选择图片2.后台服务器解码3.上传完成D:\ tu..._mui 图片上传

沉浸式状态栏,其实真的没什么_kotlin沉浸-程序员宅基地

很多人在做侧滑布局的时候,会遇到主界面与侧滑菜单的状态栏共用了一个,看起来特别的丑,比如: 这图片是在鸿洋那里搞来的。。。。。侧滑的时候布局的状态栏是什么鬼,能不能像qq那样,我不要那么丑的还顶在上面我要这个样子的 这个是在4.4.2上面的效果,5.0以上状态栏会有一层黑透明的效果,但是似乎没上面的那种古怪影响。比如这样: 好了,介绍结束了,我来说说如何实现qq这种的状态栏的效_kotlin沉浸

对servlet的理解:_写一个创建servlet的类就是编写一个特殊类的子类,这个特殊的类就是javax.serv-程序员宅基地

目录selvlet概念理解:servlet的生命周期:servlet的功能:servlet的作用域:selvlet概念理解:写一个创建servl的类就是编写一个Javax.servlet.http包中的HttServlet类的子类,而HttpServlet实现的Servlet的接口,实现了响应用户的方法。HttpSert的子类被称作一个Servlet类,而其创建的对象也被称作一个servlet。servlet的生命周期:1.初始化servlet。servlet第一._写一个创建servlet的类就是编写一个特殊类的子类,这个特殊的类就是javax.serv

计算机中触发器的原理,计算机的工作原理:RAM系列-触发器-程序员宅基地

计算机是什么呢?——简而言之,可以看成是一个“自动干活的设备”。说起来并不复杂,我们一一拆解一下这句话。首先“设备”很好理解,不用多解释。“干活”也好理解,就是要能实现一定的功能。“自动”是啥意义呢?——就是在初始人为干预结束后,设备能自动运行,也就是说,机器能自己存储并执行某种预设的“指令”。按照这个理解,我们基本就可以得到计算机的组成了:负责干活的设备和负责存储的设备。我们把前者叫做CPU,后..._计算机组成原理触发器

笔试题- 回文串_笔试回文字符串-程序员宅基地

笔试题 - 回文字符串_笔试回文字符串