我的程序(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
,它说:
File Type: LIBRARY
.... 245 public symbols .... 4DBE __imp__inflateInit2_@16 4DBE _inflateInit2_@16
此外,此列表中还有其他未解决的符号。
那么问题出在哪里呢?为什么链接器找不到这些函数?
更新:重新编译zlib
后,现在是__imp__inflateInit2_@4
/Gz
编译器开关),您似乎将__stdcall
设置为默认的调用约定,而调用代码期望使用老旧的__cdecl
。 - Igor Tandetnik@16
是stdcall名称修饰的明显标志。还有一件事要检查:也许函数声明类似于void ZLIBAPI inflateEnd(...)
,而宏ZLIBAPI
在一个地方扩展为__stdcall
,但在另一个地方扩展为__cdecl
。 - Igor TandetnikinflateInit2
,而不是inflateEnd
。@ 符号后面的数字是所有函数参数所需的总字节数,因此对于不同的函数,它可能会有所不同。同样,这就是 __stdcall 名称修饰的工作原理(请参阅 此文档 中的“名称修饰”部分)。 - Igor Tandetnik