1

我有一个 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"

项目设置:

Linker->General->Additional Library Dependencies : C:\somepath\zlib

链接器->输入- >附加依赖项:zlibstatic.lib

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

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

两次直接命中但它没有做任何事情..

我看到了这个问题,但我认为我没有这个问题,因为:

  1. 我没有使用 contrib 解决方案,我用cmake -G "Visual Studio 10"生成了一个
  2. 我之前定义了 ZLIB_WINAPI 作为对最佳答案的评论建议。

它实际上是一个开源项目,所以如果有人可以尝试重现该问题:

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

2 回答 2

9

在我看来,这听起来像是您的 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. 检查 symbol.txt 中的 deflateEnd、deflate 和 deflateInit

我的输出如下所示:

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

我的猜测是你的垃圾箱输出看起来和我的一样。现在将我的输出与您丢失的符号进行比较

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

@X 后缀给了我一个提示,即您的代码正在标准调用约定中查找函数,但您的库是使用 c 调用约定构建的。

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

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

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

于 2013-11-22T20:20:24.497 回答
1

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

右键单击项目 > 属性 > C/C++ > 预处理器,将“ZBLI_WINAPI”添加到“预处理器定义”并重建为我解决了它。

于 2017-02-06T17:43:18.430 回答