Windows上编译libpng

Windows上编译libpng

转自:http://www.cnblogs.com/len3d/p/3201085.html

下载libpng 1.5.10并解压到[工作目录]/png/libpng-1.5.10

用CMake选择png/libpng-1.5.10目录并Configure:

CMAKE_C_FLAGS_DEBUG=/D_DEBUG /MTd /Zi  /Ob0 /Od /RTC1

CMAKE_C_FLAGS_RELEASE=/MT /O2 /Ob2 /D NDEBUG

CMAKE_INSTALL_PREFIX=[工作目录]\png\install

ZLIB_INCLUDE_DIR=[工作目录]\zlib\elvic\include

ZLIB_LIBRARY=optimized;[工作目录]/zlib/elvic/lib/libz.lib;debug;[工作目录]/zlib/elvic/lib/libz_d.lib

不要勾选以下选项:

PNG_DEBUG
PNG_SHARED
PNG_TESTS

只勾选:

PNG_STATIC

然后就可以Generate并打开libpng.sln编译了。

 

Windows下zlib库和libPng库的编译和使用

转自:http://blog.sina.com.cn/s/blog_74dfa9f40101h33m.html

关于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”(......);正在链接对象,如同没有调试信息一样

这个不影响代码的运行。

VC6 下 libpng 库的编译与初步使用

转自:http://www.cnblogs.com/mr-wid/archive/2013/04/19/3029842.html

目录

一、libpng 库的介绍

libpng 用于处理 png 格式的图片, 是一套比较完善的 png 图片处理库, 免费、开源, 因此受到了很高的好评。遗憾的是, 它的官方网站: htp://www.libpng.org/ 现已不能直接访问。但是我们依然能够通过 sourceforge 来下载所需的相关文件。

libpng 在 sourceforge 上的项目地址: http://sourceforge.net/projects/libpng/

目前最新版本的 libpng 为 1.61。

二、VC6 下 libpng 的编译

1. 下载 libpng 与 zlib

笔者所用的IDE依然为 Visual Studio 6.0 ( VC++ 6 ), 所以这里以 VC6 下的编译\使用来作介绍。

首先下载两个库, 一个是 libpng , 另一个则是 zlib 库, zlib 库是一套用于压缩数据的库, libpng 借助了该库作为压缩引擎, 也就是说, libpng 依赖于 zlib 库。

关于这两个库的版本选择, 最新版本的 libpng 和 zlib 都没有提供适用于 VC6 的工程文件, 但是提供的有 vc 9\10 的, 当然, 新版本的 VS 可以将旧的工程文件来进行转换, 但是反过来不行。 因此要下载到适合 VC6 进行编译的版本。

笔者的选择是:

如果使用的是更高版本的VS, 那么你也可以从该页 http://sourceforge.net/projects/libpng/files/ 选择适合你的 libpng 和 zlib。

2. 进行编译

将下载到的文件( lpng1412.zip、zlib123.zip )进行解压后(任意目录, 例如: E:\\lpng1412), 进入到 libpng 的解压目录, 找到 libpng 的工作空间文件, 位于:

\\lpng1412\\projects\\visualc6\\libpng.dsw

将该工作区文件打开时, VC6会提示要找到 zlib 库的工程文件, 如图:

这时通过文件选择对话框找到 zlib 工程文件 zlib.dsp 所在的位置后, 点OK进行确定。 zlib 工程文件位于 zlib 解压文件夹中的:

\\zlib123\\projects\\visualc6\\zlib.dsp

此时工作区中有三个项目, libpng、pngtest、zlib, 在组建工具栏中, 如图:

选择需要的编译方式, 如果你的 VC6 常用工具栏中没有如图所示的选项, 右键工具栏的空白处, 在弹出的菜单中选择 "Build" 将该工具栏调出, VC6安装时默认只有一个 "Build MiniBar"。

 

一般情况下, 我们需要以 .lib 方式进行调用, 所以这里使用 Win32 LIB Debug 和 Win32 LIB Release 两种模式对 libpng 各进行一次编译, 也就得到了两个 lib 版本, 一个份 debug 的, 一份是 release 的。

如果需要以 dll 方式进行调用( Win32 DLL Debug\Release ), 或者打算给 VB 进行调用( Win32 DLL VB ), 那么也可以根据自己需要选择其他的编译方式。

3. 得到 .lib 文件

编译完成后, 如果没有出现错误, 此时在 libpng 和 zlib 库的工程文件所在的文件夹下均会出现 Win32_LIB_Debug 和 Win32_LIB_Release 两个文件夹, 检查这4个文件夹中是否有以下4个文件:

  • 1>. zlib 库:
    • zlibd.lib ( Win32_LIB_Debug 模式生成 )
    • zlib.lib ( Win32_LIB_Release 模式生成 )
  • 2>. libpng 库:
    • libpngd.lib ( Win32_LIB_Debug 模式生成 )
    • libpng.lib ( Win32_LIB_Release 模式生成 )

如果存在, 恭喜, 编译完成。

三、初步使用

1. 对 VC6 进行设置

库虽然已经编译完成了, 但是如果要使用, 我们还得将其加入到 VC6 的目录中, 让 VC6 在编译链接时能够找到这两个库。

菜单栏 -> 工具(Tools) -> 选项(Options) -> 目录选项卡(Directories)

在 include files 选项中, 将 libpng 和 zlib 库所在的文件夹加入其中(.h\.c源码文件所在的文件夹)。

在 library files 选项中, 将刚刚编译得到的 .lib 文件所在的文件夹加入其中。

完成后如上图所示, 当然, 如果你嫌lib路径中一次添加4个文件夹路径有点浪费, 那么你完全可以将那 4 个 .lib 文件放在一个文件夹下再添加进去, 或者直接复制到已有的 lib 路径文件夹下都行。

2. 将 .lib 文件添加到工程设置中

新建一个工程, 工程类型就选 Win32 Console Application 的空工程吧, 在工程设置(Projet Settings)中 ( 工作空间 -> 右键工程 -> 设置...(Settings...) 的 链接(Link) 选项卡中的 对象\库模块(Object\library modules) 中添加刚刚编译得到的 .lib 文件名称.

Win32 Debug 添加 zlibd.lib libpngd.lib , Win32 Release 模式添加 zlib.lib libpng.lib

如果你不想这样做, 也可以使用 #pragma comment(lib, "libpng.lib") 这个的命令来完成。

3. 使用 libpng 检测文件是否为 png 格式的图像

假设上面的步骤都已经完成后, 我们来写一段代码测试下 libpng 是否已经可用, 这段代码的作用是检查一个文件是否为 png 格式的图片:

复制代码
 1     #include <stdio.h>
 2     #include "png.h"        // libpng 库的一个重要头文件
 3 
 4     int main()
 5     {
 6         int is_png;            //是否为png
 7         char cbHeader[8];    //文件头
 8         FILE *fp = fopen( "test.png", "rb" );
 9 
10         if( !fp )
11         {
12             puts( "文件打开错误!" );
13             return 0;
14         }
15 
16         fread( cbHeader, 1, 8, fp );    //从文件中读取文件头
17 
18         is_png = png_sig_cmp( cbHeader, 0, 8 );    //检测该文件头是否为 png 格式的图片
19 
20         is_png == 0 ? puts( "是png" ) : puts( "不是png" );
21 
22         return 0;
23     }
复制代码

 

编译运行, 会发现出现了几下如下的错误:

复制代码
        Compiling...
        main.c
        Linking...
        MSVCRT.lib(MSVCRT.dll) : error LNK2005: __snprintf already defined in LIBCD.lib(snprintf.obj)
        MSVCRT.lib(MSVCRT.dll) : error LNK2005: _malloc already defined in LIBCD.lib(dbgheap.obj)
        MSVCRT.lib(MSVCRT.dll) : error LNK2005: _free already defined in LIBCD.lib(dbgheap.obj)
        LINK : warning LNK4098: defaultlib "MSVCRT" conflicts with use of other libs; use /NODEFAULTLIB:library
        Debug/libpng_demo.exe : fatal error LNK1169: one or more multiply defined symbols found
        Error executing link.exe.

        libpng_demo.exe - 4 error(s), 1 warning(s)
复制代码

 

 

大致的意思是说 xxx 在 LIBCD.lib 中已经有了定义, 这个比较好解决, 我们选择将 LIBCD.lib 这个库进行忽略即可, 忽略的方式为, 进入工程设置, 找到 Link 选项卡, 在分类(Categor)中选择 输入(Input), 下面有个 忽略库(Ignore libraries), 将 LIBCD.lib 添加进去确定。如果选择Win32 Release 模式, 也会出现这个错误, 不过重复定义的库变成了 LIBC.lib, 同样方式进行忽略即可。

再次编译运行, 错误即消失, 0 error(s), 0 warning(s), 十分惬意。

代码解说:

在上段代码中, 我们运用了 libpng 提供的一个 png_sig_cmp 函数, 该函数的作用是通过文件头检测文件是否为png格式的图片, 对于 png 格式的图片, 文件开头的 8 字节来表示该文件是不是PNG文件(详见png的文件结构), 当 是png时, 函数返回 0。

因此, 在代码中我们定义了 8 个字节的存储空间 char cbHeader[8]; 并且使用标准输入输出函数读取了文件的前8个字节的内容, 将得到的文件头再交给 png_sig_cmp 进行判断。

笔者也是刚接触这个 libpng 库, 对于详细的使用方法还有待研究, 由于官网... 就不说了, 相关的完整资料也不太好找, 不过还是通过.找到了一份完整的文档(pdf, 英文)。 

下载地址: https://files.cnblogs.com/mr-wid/libpng-1.4.0-manual.zip

 

posted @ 2015-11-11 09:40  flylong0204  阅读(2972)  评论(0)    收藏  举报