3

我的程序(VS 2010)使用HAVE_ZLIB启用选项编译的 Google 缓冲区协议。我编译了最新版本zlib并添加.lib到我的项目中,但在链接期间我仍然得到

1>libprotobuf.lib(gzip_stream.obj):错误 LNK2001:无法解析的外部符号 _inflateEnd 1>libprotobuf.lib(gzip_stream.obj):错误 LNK2001:无法解析的外部符号inflateInit2 1>libprotobuf.lib(gzip_stream.obj):错误 LNK2001:未解析的外部符号 _inflate 1>libprotobuf.lib(gzip_stream.obj):错误 LNK2001:未解析的外部符号deflateInit2 1>libprotobuf.lib(gzip_stream.obj):错误 LNK2001:未解析的外部符号 _deflate 1>libprotobuf.lib(gzip_stream.obj) : 错误 LNK2001: 未解析的外部符号 _deflateEnd

我用过dumpbin.exe /all zlib.lib,它说:

文件类型:图书馆

....

245 public symbols

....

 4DBE __imp__inflateInit2_@16
 4DBE _inflateInit2_@16

此列表中还有其他未解析的符号。

那怎么了?为什么链接器找不到这些函数?

upd:zlib现在重新编译后__imp__inflateInit2_@4

4

1 回答 1

2

zlib 函数被定义为 ZEXPORT。如果定义了 ZLIB_WINAPI,则 ZEXPORT 定义为 __stdcall,否则它没有任何值,所有 zlib 函数默认定义为 __cdecl。

当我在VS2015中编译zlib时,在zlib项目中定义了ZLIB_WINAPI,而在我的c++项目中没有定义ZLIB_WINAPI。所以我的项目是在zlib .lib 文件中寻找__cdecl 函数,而zlib .lib 文件被编译为__stdcall。

要解决这个问题,您需要告诉项目中的编译器 zlib .lib 文件使用 __stdcall 调用约定。

做的是使用:

#define ZLIB_WINAPI

#include "....\zlib.h"

在你的项目中

于 2015-10-06T12:32:09.860 回答