我的程序(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
答案 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
在你的项目中