C++ 尽管在 zlib.lib 中链接,但未解析的外部
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5424549/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Unresolved externals despite linking in zlib.lib
提问by RSuthke
I've been trying to compile an application which utilizes zlib compression in VC++ 2010.
我一直在尝试编译一个在 VC++ 2010 中使用 zlib 压缩的应用程序。
I get the
我得到
error LNK2019: unresolved external symbol _inflateInit2_ referenced in function ...
error message, which wouldn't be unusual if I didn't link the lib. I link the static release zlib library.
错误消息,如果我没有链接库,这不会不寻常。我链接了静态发布 zlib 库。
I've managed to get this exact same configuration of libs and headers working perfectly in different solutions and hence this behavior is greatly unexpected.
我已经设法使库和标头的完全相同的配置在不同的解决方案中完美运行,因此这种行为非常出乎意料。
Any ideas will be appreciated.
任何想法将不胜感激。
UPDATE: Linker command line
更新:链接器命令行
/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
/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
UPDATE 2: Verbose linker output:
更新 2:详细链接器输出:
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_
回答by Hook
If you are using the VS2010 solution provided in contrib/ be aware that it's bugged. The zlibstat project defines ZLIB_WINAPI which according to zlib FAQis used to switch on the STDCALL convention. Just remove it from the project settings and recompile the lib.
如果您使用的是 contrib/ 中提供的 VS2010 解决方案,请注意它存在漏洞。zlibstat 项目定义了 ZLIB_WINAPI,根据zlib FAQ用于打开 STDCALL 约定。只需将其从项目设置中删除并重新编译 lib。
回答by twobob
In my case I amended
就我而言,我修改了
- Config -> Linker -> Input -> Additional Dependencies
- 配置 -> 链接器 -> 输入 -> 附加依赖项
to read ucrt.lib;vcruntime.lib;msvcrt.lib;kernel32.lib
阅读 ucrt.lib;vcruntime.lib;msvcrt.lib;kernel32.lib
This enabled libz to build under Windows 10 with VS2015
这使 libz 能够使用 VS2015 在 Windows 10 下构建
Ensuring the build type was /MD
确保构建类型为 /MD
This was also the case if building for libpng (that requires zlib), the same modifications enable successful building with the old included default 'projects' files.
如果为 libpng(需要 zlib)构建,情况也是如此,相同的修改可以使用旧的包含的默认“项目”文件成功构建。
回答by Michael Burr
A few shot-in-the-dark suggestions:
一些暗中拍摄的建议:
Try running dumpbin /symbols zlib.lib
to see if the symbols in that lib are as you expect (ie., is inflateInit2
in there?).
尝试运行dumpbin /symbols zlib.lib
以查看该库中的符号是否符合您的预期(即,inflateInit2
在那里?)。
If the build is currently relying on a lib path search to locate zlib.lib
, try specifying the full absolute path to the library to rule out the linker finding some stale zlib library somewhere else on your system.
如果构建当前依赖于 lib 路径搜索来定位zlib.lib
,请尝试指定库的完整绝对路径以排除链接器在系统上的其他位置找到一些陈旧的 zlib 库。
Also, post the command line used for the linker (from the build log file).
此外,发布用于链接器的命令行(来自构建日志文件)。
Update:
更新:
You can see behavior like this if you're accidentally mixing 32-bit and 64-bit components (ie., the zlib.lib
file is built for x86 and the application is being built for x64). The linker doesn't complain about not finding the lib file, nor does it complain that the objects in the lib file are for a different platform. Given that your error message mentions a symbol without any decoration, I'd bet that the linker is building an x64 application, but maybe the zlib.lib has x86 objects (and therefore there's a symbol named _inflateInit2
in there, decorated with an underscore or maybe something else).
如果您不小心混合了 32 位和 64 位组件(即,zlib.lib
文件是为 x86 构建的,而应用程序是为 x64 构建的),您会看到这样的行为。链接器不会抱怨找不到 lib 文件,也不会抱怨 lib 文件中的对象用于不同的平台。鉴于您的错误消息提到一个没有任何修饰的符号,我敢打赌链接器正在构建一个 x64 应用程序,但也许 zlib.lib 有 x86 对象(因此那里有一个命名的符号_inflateInit2
,用下划线装饰,或者也许别的东西)。
(as an aside - I wonder if it's possible to mix x86 and x64 objects in the same lib file as long as the have different names. Not that I want to actually do this).
(顺便说一句 - 我想知道是否可以在同一个 lib 文件中混合 x86 和 x64 对象,只要它们具有不同的名称。并不是说我真的想这样做)。
回答by TonyK
Be aware that the order of the libraries matters. Suppose you want to link A.OBJ, B.LIB, and C.LIB, with the input files specified in this order. If C.LIB calls a function in B.LIB, it won't be found (unless it was already fortuitously called from A.OBJ).
Could this be the source of your problem?
请注意,库的顺序很重要。假设您要将 A.OBJ、B.LIB 和 C.LIB 与按此顺序指定的输入文件链接起来。如果 C.LIB 调用 B.LIB 中的函数,它将不会被找到(除非它已经被 A.OBJ 偶然调用了)。
这可能是您问题的根源吗?
回答by Josh Kelley
Did you verify that your zlib function prototypes are in an extern "C"
block? If not, then the linker will be looking for functions with C++-mangled names, while zlib.lib will contain the unmangled C names.
您是否验证过您的 zlib 函数原型在一个extern "C"
块中?如果不是,则链接器将查找具有 C++ 修饰名称的函数,而 zlib.lib 将包含未修饰的 C 名称。
回答by J T
You compiled the zlib static library using something other than VC++ 2010?
您使用 VC++ 2010 以外的其他东西编译了 zlib 静态库?
Is this a recent upgrade from VS2008/05?
这是最近从 VS2008/05 升级的吗?
Have you tried recompiling the static library using the 2010 toolset?
您是否尝试过使用 2010 工具集重新编译静态库?
回答by C.D.
I ran into the same problem myself using Visual Studio 2017. I got error messages like:
我自己在使用 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
I followed the tip from Michael Burr, checking if the zlib file I had contained these methods:
我遵循了 Michael Burr 的提示,检查了我的 zlib 文件是否包含这些方法:
dumpbin /symbols zlib.lib
The output showed the methods were there, yet Visual Studio still complained. Ultimately I downloaded the latest stable release of zlib from their github repository, and then compiled it (using a Visual Studio Developer Console). Their instructions were not directly helpful though eventually I found their MS Makefile which contained the command I needed to run.
输出显示方法在那里,但 Visual Studio 仍然抱怨。最终我从他们的 github 存储库下载了 zlib 的最新稳定版本,然后编译它(使用 Visual Studio 开发人员控制台)。他们的说明并没有直接帮助,但最终我找到了他们的 MS Makefile,其中包含我需要运行的命令。
nmake -f win32/Makefile.msc
Have a look inside their win32/Makefile.msc file for more information on the building process.
查看他们的 win32/Makefile.msc 文件,了解有关构建过程的更多信息。
The build process generated two .lib files. What I really needed in my project was the one called 'zdll.lib'. (See their documentation file DLL_FAQ.txt for info on it). Back inside Visual Studio, I had to manually add the file to my project (NOTusing the Linker --> General --> Additional Library Directories
method, since this triggered the other problems.) You can add them by Right-Clicking on the Solution Object (Not the topmost item in the list, but the second item. In the picture below, my project is called Lasso, so you would want to click on the equivalent in your project.)
构建过程生成了两个 .lib 文件。我在我的项目中真正需要的是名为“ zdll.lib”的那个。(有关它的信息,请参阅他们的文档文件 DLL_FAQ.txt)。回到 Visual Studio,我必须手动将文件添加到我的项目中(不使用该Linker --> General --> Additional Library Directories
方法,因为这触发了其他问题。)您可以通过右键单击解决方案对象(不是列表中的最顶部项目,但第二个项目。在下图中,我的项目称为套索,因此您需要单击项目中的等效项。)
Go to: Add --> Existing Item...
转到:添加 --> 现有项目...
Then select the generated zdll.lib file.
然后选择生成的 zdll.lib 文件。