龙空技术网

VS2015编译zlib库

坤仔kun 178

前言:

今天看官们对“vs2015里面没有win32”可能比较着重,姐妹们都需要分析一些“vs2015里面没有win32”的相关文章。那么小编在网摘上网罗了一些关于“vs2015里面没有win32””的相关知识,希望小伙伴们能喜欢,小伙伴们一起来了解一下吧!

zlib库下载地址:

版本:zlib-1.2.11

下载的源码已经包含了VS工程的,VS工程在目录:zlib-1.2.11\contrib\vstudio,这里只编译VC14,即VS2015工程

编译好的工程和生成文件放在了git上:

编译过程有如下错误:

Win32 Debug报错:

1>match686.obj : error LNK2026: 模块对于 SAFESEH 映像是不安全的。

1>inffas32.obj : error LNK2026: 模块对于 SAFESEH 映像是不安全的。

解决方法:

在“项目属性->链接器->命令行->其他选项(D)”中添加/SAFESEH:NO

或者 在“项目属性->链接器->高级->映像具有安全异常处理程序”将“是(/SAFESEH)”修改为“否(/SAFESEH:NO)”

zlibvc和testzlib两个项目需要添加

x64 Debug编译时会报执行命令失败,实际就是命令错了

解决方法:

x64 Debug zlibvc项目属性->生成事件->预先生成事件->命令行

原命令为:

cd ..\..\contrib\masmx64

bld_ml64.bat

可以直接复制x64 Release的命令行过来,Release的是正确

cd ..\..\masmx64

bld_ml64.bat

编译是完成了,但是使用时发现报错:

error LNK2019: 无法解析的外部符号 _deflate

error LNK2001: 无法解析的外部符号 _deflateEnd

error LNK2019: 无法解析的外部符号 _deflateInit_

error LNK2001: 无法解析的外部符号 _inflateEnd

error LNK2001: 无法解析的外部符号 _inflateInit2_

error LNK2019: 无法解析的外部符号 _inflate

error LNK2019: 无法解析的外部符号 _inflateReset

解决方法:

在使用zlib库的项目的属性-> C/C++-> 预处理器-> 预处理器定义 添加 ZLIB_WINAPI

分析:查看zlib.h头文件的函数声明:

ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));

查看声明中的宏定义

ZEXTERN的定义#ifndef ZEXTERN# define ZEXTERN extern#endifZEXPORT的定义# ifdef ZLIB_WINAPI# ifdef FAR# undef FAR# endif# include <windows.h> /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */# define ZEXPORT WINAPI# ifdef WIN32# define ZEXPORTVA WINAPIV# else# define ZEXPORTVA FAR CDECL# endif# endif或者#ifndef ZEXPORT# define ZEXPORT#endif

由此可以看出只有定义了ZLIB_WINAPI后才会定义#define ZEXPORT WINAPI

查看编译zlib的工程,预处理器定义中都是定义了ZLIB_WINAPI

参考:

标签: #vs2015里面没有win32