协议缓冲区 + zlib = 未解析的外部符号

protocol buffers + zlib = unresolved external symbol

本文关键字:外部 符号 缓冲区 zlib 协议      更新时间:2023-10-16

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

1>libprotobuf.lib(gzip_stream.obj):错误LNK2001:未解决 外部符号 _inflateEnd 1>libprotobuf.lib(gzip_stream.obj) : 错误 LNK2001:未解析的外部符号膨胀Init2 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

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

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

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

执行是使用:

#define ZLIB_WINAPI

以前

#include "....zlib.h"

在您的项目中