Windows下zlib库和libPng库的编译和使用
2015-08-04 11:33
260 查看
转自:http://www.360doc.com/content/15/0804/11/26961978_489408309.shtml
这里inffas32.obj和match686.obj我并没有通过本文得到,我在zlib-1.2.8->contrib->masmx86下的readme.txt文档里看到,可通过http://www.winimage.com/zLibDll/zlib124_masm_obj.zip,解压后获得contrib->masmx86的inffas32.obj和match686.obj拷贝至和.asm文件的同一目录下。
我用的lpng1617,这两个库编译后都出现了问题,都是编译成功无法启动程序,不知道什么情况。出现链接zlib-1.2.8\contrib\vstudio\vc10\x86\ZlibDllDebug\zilbwapid.dll,另个是lpng1617\projects\vstudio\Debug\zlib.lib
这里inffas32.obj和match686.obj我并没有通过本文得到,我在zlib-1.2.8->contrib->masmx86下的readme.txt文档里看到,可通过http://www.winimage.com/zLibDll/zlib124_masm_obj.zip,解压后获得contrib->masmx86的inffas32.obj和match686.obj拷贝至和.asm文件的同一目录下。
我用的lpng1617,这两个库编译后都出现了问题,都是编译成功无法启动程序,不知道什么情况。出现链接zlib-1.2.8\contrib\vstudio\vc10\x86\ZlibDllDebug\zilbwapid.dll,另个是lpng1617\projects\vstudio\Debug\zlib.lib
关于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个工程。其中: (1). zlibvc生成动态链接库zlibwapi.dll和对应的导入库zlibwapi.lib (2). zlibstat生成静态链接库zlibstat.lib (3). testzlibdll测试生成的动态链接库zlibwapi.dll (4). testzlib测试生成的静态链接库zlibstat.lib 最后我们在debug模式下编译整个解决方案。生成的dll和lib文件可在相应的文件夹中找到。 下边介绍如何使用编译好的动态或是静态库。(假设项目工程已经建立完毕) 这里我们把静态库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。 下边介绍如何使用编译好的静态库。(假设项目工程已经建立完毕) 这里我们把静态库 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”(......);正在链接对象,如同没有调试信息一样 这个不影响代码的运行。 |
相关文章推荐
- STM32 HAL drivers < STM32F7 >
- hibernate4.3.10使用注解映射方式样例
- 008.屏幕尺寸_代码布局
- 第17章 文本和字体_17.6 一些有趣和新奇的内容
- Java 获取APK安装程序的包名
- udp打洞过程
- 图像处理——光效公式
- 数据仓库搭建全过程解析--通俗易懂
- C++中的树、二叉树、二叉树遍历、二叉树前序、中序、后序遍历相互求法
- Multiplexing
- Mantle简单认识及使用
- C++学习笔记
- 新发现的毛泽东24岁写的作文《心之力》
- C++中的树、二叉树、二叉树遍历、二叉树前序、中序、后序遍历相互求法
- Lock&Condition实现线程同步通信
- iOS 图片与内存(转)
- IOS之UIStepper控件详解
- ARCGIS Server 发布服务时出现的问题解决
- nginx中的内存池
- Kth Smallest Element in a BST —— Leetcode