尽管链接了zlib.lib,仍然存在未解决的外部引用异常。

34
我一直在尝试编译一个使用zlib压缩的应用程序,用的是VC++ 2010。但是我收到了以下错误信息:

"error LNK2019: 在函数...中未解析的外部符号inflateInit2"。

如果我没有链接库,则这并不奇怪。我链接了静态发布的zlib库。我已经成功地在不同的解决方案中使用相同的库和头文件配置,因此这种行为非常出乎意料。任何建议将不胜感激。

链接器命令行:
"/OUT:"C:\Documents and Settings\Suthke\My Documents\Visual Studio 2010\Projects\SBRapGen2\Debug\SBRapGen2.exe" /INCREMENTAL /NOLOGO "zlib.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /MANIFEST /ManifestFile:"Debug\SBRapGen2.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\Documents and Settings\Suthke\My Documents\Visual Studio 2010\Projects\SBRapGen2\Debug\SBRapGen2.pdb" /SUBSYSTEM:CONSOLE /PGD:"C:\Documents and Settings\Suthke\My Documents\Visual Studio 2010\Projects\SBRapGen2\Debug\SBRapGen2.pgd" /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE"

链接器详细输出:

1>------ Build started: Project: SBRapGen2, Configuration: Release Win32 ------ 1>
1> Starting pass 1 1> Processed /DEFAULTLIB:uuid.lib 1> Processed /DEFAULTLIB:msvcprt 1> Processed /DEFAULTLIB:zlib.lib 1> Processed /DEFAULTLIB:MSVCRT 1> Processed /DEFAULTLIB:OLDNAMES 1>
1> Searching libraries 1> Searching C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\zlib.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\kernel32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\user32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\gdi32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\winspool.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\comdlg32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\advapi32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\shell32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\ole32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\oleaut32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\uuid.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\odbc32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\odbccp32.lib: 1> Searching C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\msvcprt.lib: 1> Searching C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\MSVCRT.lib: 1> Found @__security_check_cookie@4 1> Referenced in SBRapGen2.obj 1> Loaded MSVCRT.lib(secchk.obj) 1> Found __imp__sprintf 1> Referenced in SBRapGen2.obj 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __imp__ceil 1> Referenced in SBRapGen2.obj 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __imp__free 1> Referenced in SBRapGen2.obj 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __imp__malloc 1> Referenced in SBRapGen2.obj 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __imp__printf 1> Referenced in SBRapGen2.obj 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __imp__fopen 1> Referenced in SBRapGen2.obj 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __imp__fread 1> Referenced in SBRapGen2.obj 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __imp__fwrite 1> Referenced in SBRapGen2.obj 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __imp__ftell 1> Referenced in SBRapGen2.obj 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __imp__fseek 1> Referenced in SBRapGen2.obj 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __imp__fclose 1> Referenced in SBRapGen2.obj 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found _mainCRTStartup 1> Loaded MSVCRT.lib(crtexe.obj) 1> Found ___report_gsfailure 1> Referenced in MSVCRT.lib(secchk.obj) 1> Loaded MSVCRT.lib(gs_report.obj) 1> Found ___security_cookie 1> Referenced in MSVCRT.lib(secchk.obj) 1> Referenced in MSVCRT.lib(gs_report.obj) 1> Loaded MSVCRT.lib(gs_cookie.obj) 1> Found __IMPORT_DESCRIPTOR_MSVCR100 1> Referenced in MSVCRT.lib(MSVCR100.dll) 1> Referenced in MSVCRT.lib(MSVCR100.dll) 1> Referenced in MSVCRT.lib(MSVCR100.dll) 1> Referenced in MSVCRT.lib(MSVCR100.dll) 1> Referenced in MSVCRT.lib(MSVCR100.dll) 1> Referenced in MSVCRT.lib(MSVCR100.dll) 1> Referenced in MSVCRT.lib(MSVCR100.dll) 1> Referenced in MSVCRT.lib(MSVCR100.dll) 1> Referenced in MSVCRT.lib(MSVCR100.dll) 1> Referenced in MSVCRT.lib(MSVCR100.dll) 1> Referenced in MSVCRT.lib(MSVCR100.dll) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found ___CxxSetUnhandledExceptionFilter 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(unhandld.obj) 1> Found __amsg_exit 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __imp____getmainargs 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __dowildcard 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(wildcard.obj) 1> Found __newmode 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(_newmode.obj) 1> Found _atexit 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(atonexit.obj) 1> Found __RTC_Terminate 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(initsect.obj) 1> Found __imp___cexit 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __imp___exit 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __XcptFilter 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __imp__exit 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __imp____initenv 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __IsNonwritableInCurrentImage 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(pesect.obj) 1> Found __initterm 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found ___xc_a 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(cinitexe.obj) 1> Processed /DEFAULTLIB:kernel32.lib 1> Processed /DISALLOWLIB:libcmt.lib 1> Processed /DISALLOWLIB:libcmtd.lib 1> Processed /DISALLOWLIB:msvcrtd.lib 1> Found __initterm_e 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found ___native_startup_state 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(natstart.obj) 1> Found __SEH_epilog4 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Referenced in MSVCRT.lib(atonexit.obj) 1> Loaded MSVCRT.lib(sehprolg4.obj) 1> Found __except_handler4 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Referenced in MSVCRT.lib(atonexit.obj) 1> Referenced in MSVCRT.lib(pesect.obj) 1> Referenced in MSVCRT.lib(sehprolg4.obj) 1> Loaded MSVCRT.lib(chandler4gs.obj) 1> Found __imp___configthreadlocale 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found ___globallocalestatus 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(xthdloc.obj) 1> Found __setdefaultprecision 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(fp8.obj) 1> Found __imp____setusermatherr 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __matherr 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(merr.obj) 1> Found __setargv 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(dllargv.obj) 1> Found __commode 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(xncommod.obj) 1> Found __imp___commode 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __imp___fmode 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __fmode 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(xtxtmode.obj) 1> Found __imp____set_app_type 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found ___security_init_cookie 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded MSVCRT.lib(gs_support.obj) 1> Found __crt_debugger_hook 1> Referenced in MSVCRT.lib(gs_report.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __NULL_IMPORT_DESCRIPTOR 1> Referenced in MSVCRT.lib(MSVCR100.dll) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found MSVCR100_NULL_THUNK_DATA 1> Referenced in MSVCRT.lib(MSVCR100.dll) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found "void __cdecl terminate(void)" (?terminate@@YAXXZ) 1> Referenced in MSVCRT.lib(unhandld.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __unlock 1> Referenced in MSVCRT.lib(atonexit.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found ___dllonexit 1> Referenced in MSVCRT.lib(atonexit.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __lock 1> Referenced in MSVCRT.lib(atonexit.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __imp___onexit 1> Referenced in MSVCRT.lib(atonexit.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __except_handler4_common 1> Referenced in MSVCRT.lib(chandler4gs.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __invoke_watson 1> Referenced in MSVCRT.lib(fp8.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Found __controlfp_s 1> Referenced in MSVCRT.lib(fp8.obj) 1> Loaded MSVCRT.lib(MSVCR100.dll) 1> Searching C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\OLDNAMES.lib: 1> Searching C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\zlib.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\kernel32.lib: 1> Found __imp__InterlockedExchange@8 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Found __imp__Sleep@4 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Found __imp__InterlockedCompareExchange@12 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Found __imp__HeapSetInformation@16 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Found __imp__EncodePointer@4 1> Referenced in MSVCRT.lib(crtexe.obj) 1> Referenced in MSVCRT.lib(atonexit.obj) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Found __imp__TerminateProcess@8 1> Referenced in MSVCRT.lib(gs_report.obj) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Found __imp__GetCurrentProcess@0 1> Referenced in MSVCRT.lib(gs_report.obj) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Found __imp__UnhandledExceptionFilter@4 1> Referenced in MSVCRT.lib(gs_report.obj) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Found __imp__SetUnhandledExceptionFilter@4 1> Referenced in MSVCRT.lib(gs_report.obj) 1> Referenced in MSVCRT.lib(unhandld.obj) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Found __imp__IsDebuggerPresent@0 1> Referenced in MSVCRT.lib(gs_report.obj) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Found __imp__DecodePointer@4 1> Referenced in MSVCRT.lib(atonexit.obj) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Found __imp__QueryPerformanceCounter@4 1> Referenced in MSVCRT.lib(gs_support.obj) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Found __imp__GetTickCount@0 1> Referenced in MSVCRT.lib(gs_support.obj) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Found __imp__GetCurrentThreadId@0 1> Referenced in MSVCRT.lib(gs_support.obj) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Found __imp__GetCurrentProcessId@0 1> Referenced in MSVCRT.lib(gs_support.obj) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Found __imp__GetSystemTimeAsFileTime@4 1> Referenced in MSVCRT.lib(gs_support.obj) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Found __IMPORT_DESCRIPTOR_KERNEL32 1> Referenced in kernel32.lib(KERNEL32.dll) 1> Referenced in kernel32.lib(KERNEL32.dll) 1> Referenced in kernel32.lib(KERNEL32.dll) 1> Referenced in kernel32.lib(KERNEL32.dll) 1> Referenced in kernel32.lib(KERNEL32.dll) 1> Referenced in kernel32.lib(KERNEL32.dll) 1> Referenced in kernel32.lib(KERNEL32.dll) 1> Referenced in kernel32.lib(KERNEL32.dll) 1> Referenced in kernel32.lib(KERNEL32.dll) 1> Referenced in kernel32.lib(KERNEL32.dll) 1> Referenced in kernel32.lib(KERNEL32.dll) 1> Referenced in kernel32.lib(KERNEL32.dll) 1> Referenced in kernel32.lib(KERNEL32.dll) 1> Referenced in kernel32.lib(KERNEL32.dll) 1> Referenced in kernel32.lib(KERNEL32.dll) 1> Referenced in kernel32.lib(KERNEL32.dll) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Found KERNEL32_NULL_THUNK_DATA 1> Referenced in kernel32.lib(KERNEL32.dll) 1> Loaded kernel32.lib(KERNEL32.dll) 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\user32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\gdi32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\winspool.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\comdlg32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\advapi32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\shell32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\ole32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\oleaut32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\uuid.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\odbc32.lib: 1> Searching C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\odbccp32.lib: 1> Searching C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\msvcprt.lib: 1> Searching C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\MSVCRT.lib: 1> Searching C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\OLDNAMES.lib: 1> Searching C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\zlib.lib: 1>
1> Finished searching libraries 1>
1> Finished pass 1 1>
1>SBRapGen2.obj : error LNK2001: unresolved external symbol _deflateEnd 1>SBRapGen2.obj : error LNK2001: unresolved external symbol inflateInit2 1>SBRapGen2.obj : error LNK2001: unresolved external symbol _inflate 1>SBRapGen2.obj : error LNK2001: unresolved external symbol _inflateEnd 1>SBRapGen2.obj : error LNK2001: unresolved external symbol _deflate 1>SBRapGen2.obj : error LNK2001: unresolved external symbol deflateInit2


_inflateInit2_末尾的下划线是干什么用的?也许这就是问题所在。 - TonyK
@TonyK: DUMPBIN报告.lib中的符号存在两个下划线。 - RSuthke
我发现这个链接对我很有帮助。像魔法一样好用:http://www.tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall/ - Dula
8个回答

83

如果您正在使用contrib/中提供的VS2010解决方案,请注意它存在漏洞。zlibstat项目定义了ZLIB_WINAPI,根据zlib FAQ,用于切换STDCALL约定。只需从项目设置中将其移除并重新编译库即可。


16
请注意,您也可以通过在主项目中定义ZLIB_WINAPI来解决该问题。 - MerickOWA
1
@MerickOWA:你说的“你也可以通过在主项目中定义ZLIB_WINAPI来解决问题”,具体是什么意思?你能再详细一些吗? - Magallo
5
在包含zlib.h头文件之前,你可以添加"#define ZLIB_WINAPI"来进行定义。 - MerickOWA
这应该在Tesseract/leptonica/zlib常见问题解答中。 - Robson

6
在我的情况下,我修改了以下内容:
  • 配置 -> 链接器 -> 输入 -> 附加依赖项

修改为 ucrt.lib;vcruntime.lib;msvcrt.lib;kernel32.lib

这使得libz在Windows 10和VS2015下编译成功

确保编译类型是/MD

如果构建libpng(需要zlib),同样的修改可以使旧的默认“projects”文件成功构建。


1
太棒了,我浪费了两天时间来构建ARM64。这个解决了我的问题。谢谢。 - prakhar3agrwal

3
在我的情况下,使用NuGet在vs2017中安装zlib-vc140-static-64(v1.2.11)或zlib_native(v1.2.11)。

2
一些瞎猜的建议:
尝试运行 dumpbin /symbols zlib.lib 命令,查看库中的符号是否符合预期(即,是否有 inflateInit2)。
如果构建当前依赖于库路径搜索来定位 zlib.lib,请尝试指定库的完整绝对路径,以排除链接器在系统其他地方找到某个旧的 zlib 库的可能性。
此外,请发布链接器使用的命令行(从构建日志文件中获取)。
更新:
如果意外混合了32位和64位组件(即,zlib.lib 文件是为x86构建的,而应用程序正在为x64构建),则可能会出现这样的行为。链接器不会抱怨找不到库文件,也不会抱怨库文件中的对象适用于不同的平台。鉴于您的错误消息没有任何修饰的符号,我敢打赌链接器正在构建一个x64应用程序,但是可能 zlib.lib 具有 x86 对象(因此其中有一个名为 _inflateInit2 的符号,并带有下划线或其他东西)。
(顺便说一句 - 我想知道是否可以将x86和x64对象混合在同一个库文件中,只要它们具有不同的名称。并不是我真的想这么做。)

所有必需的符号似乎都存在,因为已经使用了dumpbin(这也得到了确认,因为我现在能够使用相同的库编译不同的项目)。 - RSuthke
@RSuthke:好的-我应该想到由于斜体可能会出现格式问题...所以没有被找到的符号是:_inflateInit2_,前后都有下划线,对吧?顺便说一句,您可以通过将代码用反引号字符括起来或将代码块缩进4个或更多空格(这对注释无效)来格式化代码片段。 - Michael Burr
@RSuthke:我想我被卡住了。也许发布链接器命令行会给出一些线索? - Michael Burr
@RSuthke:我忘记了链接器的“/VERBOSE”选项 - 它可能会显示一些有趣的东西。 - Michael Burr
@Michael:抱歉耽搁了,我现在才拿到有代码的机器。按要求输出冗长的结果。 - RSuthke
显示剩余4条评论

1
我遇到了使用Visual Studio 2017时相同的问题。我收到了类似以下的错误消息:
error LNK2019: unresolved external symbol __imp__deflate referenced in function 
error LNK2019: unresolved external symbol __imp__deflateEnd referenced in function 
error LNK2019: unresolved external symbol __imp__inflate referenced in function 
error LNK2019: unresolved external symbol __imp__inflateEnd referenced in function 
error LNK2019: unresolved external symbol __imp__deflateInit2_ referenced in function
error LNK2019: unresolved external symbol __imp__inflateInit2_ referenced in function

我遵循了Michael Burr的建议,检查我拥有的zlib文件是否包含这些方法:

dumpbin /symbols zlib.lib

输出显示了这些方法存在,但Visual Studio仍然报错。最终,我从他们的Github存储库中下载了最新的稳定版本zlib,然后编译它(使用Visual Studio Developer Console)。他们的说明并没有直接帮助我,但最终我找到了他们的MS Makefile,其中包含了我需要运行的命令。
nmake -f win32/Makefile.msc

请查看他们的win32/Makefile.msc文件,以获取有关构建过程的更多信息。
构建过程生成了两个.lib文件。我在我的项目中真正需要的是名为“zdll.lib”的文件(请参阅其DLL_FAQ.txt文档文件以获取有关它的信息)。回到Visual Studio后,我不得不手动将该文件添加到我的项目中(而不是使用Linker --> General --> Additional Library Directories方法,因为这会触发其他问题)。您可以通过右键单击解决方案对象(不是列表中最顶部的项目,而是第二个项目。在下面的图片中,我的项目称为Lasso,因此您想要点击相应的项目)来添加它们。
转到:Add --> Existing Item...
然后选择生成的zdll.lib文件。 显式添加到Visual Studio项目的Lib文件

1

你确认你的zlib函数原型在extern "C"块中吗?如果没有,那么链接器将会寻找带有C++名称修饰的函数,而zlib.lib将包含未经名称修饰的C名称。


2
所有函数原型都按照标准zlib.h头文件,位于extern "C"块中。 - RSuthke

0

您使用的不是VC++ 2010编译zlib静态库吗?

这是最近从VS2008/05升级过来的吗?

您尝试过使用2010工具集重新编译静态库吗?


这个库是使用完全相同的VC++ 2010编译的,该编译器也被成功地用于编译其他使用相同zlib处理代码的项目。 - RSuthke

0

请注意库的顺序。假设您想要链接A.OBJ、B.LIB和C.LIB,并按照此顺序指定输入文件。如果C.LIB调用了B.LIB中的函数,则该函数将无法找到(除非它已经幸运地从A.OBJ中调用)。
这可能是您问题的根源吗?


很不可能。我在其他项目中有完全相同的代码结构,可以顺利编译和链接。 - RSuthke
尽管我记得链接器至少以TonyK描述的方式运作,但根据这份MSDN文档,链接器将会回溯搜索之前的.lib文件:http://msdn.microsoft.com/en-us/library/hcce369f.aspx。我仍然认为验证一下会是个好主意,因为我相当确定微软工具过去是按照TonyK描述的方式运作的,所以可能有一些细微之处在文档中没有清楚说明。 - Michael Burr
我将代码缩减为一个 .cpp 文件进行测试(因此只需要一个 .obj 文件),但链接问题仍然存在。 - RSuthke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接