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

时间:2013-09-13 13:11:15

标签: c++ visual-c++ linker zlib unresolved-external

我的程序(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,它说:

  

文件类型:LIBRARY

....

245 public symbols

....

 4DBE __imp__inflateInit2_@16
 4DBE _inflateInit2_@16

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

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

重新编译zlib之后

更新现在是__imp__inflateInit2_@4

1 个答案:

答案 0 :(得分:2)

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调用约定。

做的是使用:

>>> import socket
>>> socket.gethostbyname_ex(socket.gethostname())
('strauch', [], ['172.16.0.100', '192.168.157.1', '192.168.60.1'])

#define ZLIB_WINAPI

在你的项目中