【问题标题】:Zlib linker error on vs2010vs2010上的Zlib链接器错误
【发布时间】:2013-11-13 23:23:29
【问题描述】:

我有一个 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 对最佳答案的评论建议。

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

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

【问题讨论】:

  • 我不是 Windows 用户,但在 UNIX 上,我会验证搜索库的目标是否与需要的库相同,特别是它们使用相同的位数。
  • 您是否通过检查 zlibstatic.lib 的内容来检查这些符号“deflateEnd”是否存在?
  • @goldcode:我用文本编辑器打开了这个库,似乎到处都有引用。应该可以。我在谷歌搜索时看到了那个 MSDN 链接,但在我的情况下这不是问题。正如我上面所说,我用 win32 目标构建 zlib,我正在用 win32 目标构建我的项目。任何地方都没有 64 位。
  • 尝试在包含 zlib.h 的文件中添加#pragma comment(lib, "zlibstatic.lib")

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


【解决方案1】:

在我看来,这听起来像是您的 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

我的输出如下所示:

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

【讨论】:

  • 这里是符号转储的 pastebin:pastebin.com/fjf3jV3V。我通过以下方式构建zlib:下载zlib 1.28,cmake -G“Visual Studio 10”,使用Release win32构建zlibstatic项目。这有什么问题吗?无论如何,删除 ZLIB_WINAPI 有效!知道为什么吗?我已经阅读了这个zlib.net/DLL_FAQ.txt 并且FAQ 建议ZLIB_WINAPI 仅用于与dll 一起使用。我将尝试使用 ZLIB_WINAPI 和 dll 来构建,看看会发生什么
  • 我猜你的垃圾箱显示:527 : 01C 00000000 UNDEF notype () External | _deflate 您正在使用 _cdecl 约定构建您的库。现在你必须包含相同的约定。库和头文件必须使用相同的约定。两个 _cdecl 或两个 __stdcall。请更改其中之一。首先尝试不使用#define ZLIB_WINAPI。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多