vs2010上的Zlib链接器错误

时间:2013-11-13 23:23:30

标签: c++ visual-studio-2010 linker zlib

我有一个zlib链接器错误。花了几个小时尝试解决问题,但到目前为止还没有。 Zlib是使用vs2010,win32版本构建的。我的项目使用相同的。

提取错误:

error LNK2019: unresolved external symbol _deflateEnd@4 referenced in function
error LNK2019: unresolved external symbol _deflate@8 referenced in function
error LNK2019: unresolved external symbol _deflateInit_@16 referenced in function

在文件中包含zlib.h,如下所示:

#ifdef WIN32
# define ZLIB_WINAPI
#endif
#include "zlib.h"

项目设置:

链接器 - >常规 - >其他库依赖项:C:\ somepath \ zlib

链接器 - >输入 - >其他依赖关系:zlibstatic.lib

链接器详细输出(不完整,仅适用于zlib):

Searching C:\somepath\zlib\zlibstatic.lib:
Searching C:\somepath\zlib\zlibstatic.lib:

两次直接点击但它没有做任何事情......

我看到了this的问题,但我不认为我有这个问题,因为:

  1. 我没有使用contrib解决方案,我用 cmake -G生成了一个 “Visual Studio 10”
  2. 我在包含之前定义了ZLIB_WINAPI 对最佳答案的评论建议。
  3. 它实际上是一个开源项目,所以如果有人可以尝试重现问题:

    1. 克隆https://github.com/d1zzy/pvpgn.git
    2. 添加zlib库并将文件包含到pvpgn / pvpgn / zlib(或其他任何位置,只需使用自定义zlib路径编辑cmake / Modules / FindZLIB.cmake)
    3. 运行cmake -G“Visual Studio 10”,打开解决方案并尝试构建项目“bnetd”

2 个答案:

答案 0 :(得分:8)

这听起来像是zlibstatic.lib中符号与您正在寻找的符号不匹配 通过你的包括。 请尝试:

  1. 在Windows上打开命令提示符

  2. 更改为C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ bin (或您的VS安装目录)

  3. 执行vcvars32.bat

  4. dumpbin zlibstatic.lib / symbols> symbols.txt

  5. 检查symbols.txt中的deflateEnd,deflate和deflateInit

  6. 我的输出如下:

    026 00000AA0 SECT4  notype ()    External     | _deflate
    011 00000000 UNDEF  notype ()    External     | _deflateInit_
    02C 00001AC0 SECT4  notype ()    External     | _deflateEnd
    

    我的猜测是你的dumpbin输出与我的相同。 现在将我的输出与缺失的符号进行比较

    您缺少的符号:_deflateEnd @ 4,_deflate @ 8和 deflateInit @ 16

    @X postfix告诉我你的代码正在寻找标准调用约定中的函数 但你的库是使用c调用约定构建的。

    void _cdecl deflate();      // ==> _deflate
    void __stdcall deflate();   // ==> _deflate@8
    

    尝试在没有定义ZLIB_WINAPI的情况下包含“zlib.h”,但是最终使用dumpbin转储符号会给你一个线索。

    另一种可能性 - 您可能已经使用#define Z_PREFIX编译了zlibstatic.lib

答案 1 :(得分:0)

我在Visual Studio 2015中遇到了同样的问题,我假设.lib是使用" ZBLI_WINAPI"编译的。预处理器的定义,正如Markus Schumann所说。

右键点击项目>属性> C / C ++>预处理器,添加" ZBLI_WINAPI"到"预处理器定义"并且重建为我解决了。