我一直在尝试编译一个在 VC++ 2010 中使用 zlib 压缩的应用程序。
我得到错误:
错误 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”/清单 /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>—– 构建开始:项目:SBRapGen2,配置:发布 Win32 —— 1>
1> 开始阶段 1 1> 已处理 /DEFAULTLIB:uuid.lib 1> 已处理 /DEFAULTLIB:msvcprt 1> 已处理 /DEFAULTLIB:zlib.lib 1> 已处理 /DEFAULTLIB:MSVCRT 1> 已处理 /DEFAULTLIB:OLDNAMES 1>
1> 搜索库 1> 搜索 C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\zlib.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\kernel32.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\user32.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\gdi32.lib: 1>搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\winspool.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\comdlg32.lib: 1> 搜索 C :\Program Files\Microsoft SDKs\Windows\v7.0A\lib\advapi32.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\shell32.lib: 1> 搜索 C:\ Program Files\Microsoft SDKs\Windows\v7.0A\lib\ole32.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\oleaut32.lib: 1> 搜索 C:\Program Files \Microsoft SDKs\Windows\v7.0A\lib\uuid.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\odbc32.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\odbccp 32.lib: 1> 搜索 C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\msvcprt.lib: 1> 搜索 C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\MSVCRT.lib: 1>找到 @__security_check_cookie@4 1> 在 SBRapGen2.obj 中引用 1> 加载 MSVCRT.lib(secchk.obj) 1> 找到 __imp__sprintf 1> 在 SBRapGen2.obj 中引用 1> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 __imp__ceil 1 > 在 SBRapGen2.obj 中引用 1> 加载的 MSVCRT.lib(MSVCR100.dll) 1> 找到 __imp__free 1> 在 SBRapGen2.obj 中引用 1> 加载的 MSVCRT.lib(MSVCR100.dll) 1> 找到 __imp__malloc 1> 在 SBRapGen2.obj 中引用1> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 __imp__printf 1> 在 SBRapGen2.obj 中引用 1> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 __imp__fopen 1> 在 SBRapGen2.obj 中引用 1> 加载 MSVCRT.lib (MSVCR100.dll) 1> 找到 __imp__fread 1> 在 SBRapGen2.obj 中引用 1> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 __imp__fwrite 1> 在 SBRapGen2.obj 中引用 1> 加载 MSVCRT.lib(MSVCR100.dll) 1 > 找到 __imp__ftell 1> 参考在 SBRapGen2.obj 1> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 __imp__fseek 1> 在 SBRapGen2.obj 中引用 1> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 __imp__fclose 1> 在 SBRapGen2.obj 1 中引用> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 _mainCRTStartup 1> 加载 MSVCRT.lib(crtexe.obj) 1> 找到 ___report_gsfailure 1> 在 MSVCRT.lib(secchk.obj) 中引用 1> 加载 MSVCRT.lib(gs_report. obj) 1> 找到 ___security_cookie 1> 在 MSVCRT.lib(secchk.obj) 中引用 1> 在 MSVCRT.lib(gs_report.obj) 中引用 1> 加载的 MSVCRT.lib(gs_cookie.obj) 1> 找到 __IMPORT_DESCRIPTOR_MSVCR100 1> 在 MSVCRT 中引用.lib(MSVCR100.dll) 1> 在 MSVCRT.lib(MSVCR100.dll) 中引用 1> 在 MSVCRT.lib(MSVCR100.dll) 中引用 1> 在 MSVCRT.lib(MSVCR100.dll) 中引用 1> 在 MSVCRT.lib 中引用(MSVCR100.dll) 1> 在 MSVCRT.lib(MSVCR100.dll) 中引用 1> 在 MSVCRT.lib(MSVCR100.dll) 中引用 1> 在 MSVCRT.lib(MSVCR100.dll) 中引用 1> 在 MSVCRT.lib(MSVCR100) 中引用.dll) 1> 在 MSVCRT.lib(MSVCR100. dll) 1> 在 MSVCRT.lib(MSVCR100.dll) 中引用 1> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 ___CxxSetUnhandledExceptionFilter 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 MSVCRT.lib(unhandld. obj) 1> 找到 __amsg_exit 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 __imp____getmainargs 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 MSVCRT。 lib(MSVCR100.dll) 1> 找到 __dowildcard 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 MSVCRT.lib(wildcard.obj) 1> 找到 __newmode 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1 > 已加载 MSVCRT.lib(_newmode.obj) 1> 找到 _atexit 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 已加载 MSVCRT.lib(atonexit.obj) 1> 找到 __RTC_Terminate 1> 在 MSVCRT.lib(crtexe) 中引用.obj) 1> 已加载 MSVCRT.lib( initsect .obj) 1> 找到 __imp___cexit 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 已加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 __imp___exit 1> 在 MSVCRT 中引用.lib(crtexe.obj) 1> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 __XcptFilt er 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 __imp__exit 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 MSVCRT.lib(MSVCR100.dll ) 1> 找到 __imp____initenv 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 __IsNonwritableInCurrentImage 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 MSVCRT.lib (pesect.obj) 1> 找到 __initterm 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载的 MSVCRT.lib(MSVCR100.dll) 1> 找到 ___xc_a 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1>已加载 MSVCRT.lib(cinitexe.obj) 1> 已处理 /DEFAULTLIB:kernel32.lib 1> 已处理 /DISALLOWLIB:libcmt.lib 1> 已处理 /DISALLOWLIB:libcmtd.lib 1> 已处理 /DISALLOWLIB:msvcrtd.lib 1> 找到 __initterm_e 1 > 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 ___native_startup_state 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 MSVCRT.lib(natstart.obj) 1 > 找到 __SEH_epilog4 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 参考在 MSVCRT.lib(atonexit.obj) 中引用 1> 已加载 MSVCRT.lib(sehprolg4.obj) 1> 找到 __except_handler4 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 在 MSVCRT.lib(atonexit.obj) 中引用 1 > 在 MSVCRT.lib(pesect.obj) 中引用 1> 在 MSVCRT.lib(sehprolg4.obj) 中引用 1> 加载 MSVCRT.lib(chandler4gs.obj) 1> 找到 __imp___configthreadlocale 1> 在 MSVCRT.lib(crtexe.obj) 中引用1> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 ___globallocalestatus 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 MSVCRT.lib(xthdloc.obj) 1> 找到 __setdefaultprecision 1> 在 MSVCRT.lib( crtexe.obj) 1> 已加载 MSVCRT.lib(fp8.obj) 1> 找到 __imp____setusermatherr 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 已加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 __matherr 1> 在中引用MSVCRT.lib(crtexe.obj) 1> 已加载 MSVCRT.lib(merr.obj) 1> 找到 __setargv 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 已加载 MSVCRT.lib(dllargv.obj) 1> 找到 __commode 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 MSVCRT.lib(xncommod.ob j) 1> 找到 __imp___commode 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 __imp___fmode 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 MSVCRT。 lib(MSVCR100.dll) 1> 找到 __fmode 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 MSVCRT.lib(xtxtmode.obj) 1> 找到 __imp____set_app_type 1> 在 MSVCRT.lib(crtexe.obj) 中引用> 已加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 ___security_init_cookie 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 已加载 MSVCRT.lib(gs_support.obj) 1> 找到 __crt_debugger_hook 1> 在 MSVCRT.lib(gs_report 中引用.obj) 1> 已加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 __NULL_IMPORT_DESCRIPTOR 1> 在 MSVCRT.lib(MSVCR100.dll) 中引用 1> 已加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 MSVCR100_NULL_THUNK_DATA 1> 在 MSVCRT 中引用.lib(MSVCR100.dll) 1> 加载的 MSVCRT.lib(MSVCR100.dll) 1> 找到“void __cdecl terminate(void)” (?terminate@@YAXXZ) 1> 在 MSVCRT.lib(unhandld.obj) 中引用 1>加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 __unlock 1> 参考在 MSVCRT.lib(atonexit.obj) 中引用 1> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 ___dllonexit 1> 在 MSVCRT.lib(atonexit.obj) 中引用 1> 加载 MSVCRT.lib(MSVCR100.dll) 1>找到 __lock 1> 在 MSVCRT.lib(atonexit.obj) 中引用 1> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 __imp___onexit 1> 在 MSVCRT.lib(atonexit.obj) 中引用 1> 加载 MSVCRT.lib(MSVCR100. dll) 1> 找到 __except_handler4_common 1> 在 MSVCRT.lib(chandler4gs.obj) 中引用 1> 加载 MSVCRT.lib(MSVCR100.dll) 1> 找到 __invoke_watson 1> 在 MSVCRT.lib(fp8.obj) 中引用 1> 加载 MSVCRT。 lib(MSVCR100.dll) 1> 找到 __controlfp_s 1> 在 MSVCRT.lib(fp8.obj) 中引用 1> 加载的 MSVCRT.lib(MSVCR100.dll) 1> 搜索 C:\Program Files\Microsoft Visual Studio 10.0\VC\lib \OLDNAMES.lib: 1> 搜索 C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\zlib.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\kernel32.lib : 1> 找到 __imp__InterlockedExchange@8 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 kernel32.l ib(KERNEL32.dll) 1> 找到 __imp__Sleep@4 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 kernel32.lib(KERNEL32.dll) 1> 找到 __imp__InterlockedCompareExchange@12 1> 在 MSVCRT.lib(crtexe) 中引用.obj) 1> 加载 kernel32.lib(KERNEL32.dll) 1> 找到 __imp__HeapSetInformation@16 1> 在 MSVCRT.lib(crtexe.obj) 中引用 1> 加载 kernel32.lib(KERNEL32.dll) 1> 找到 __imp__EncodePointer@4 1 > 在 MSVCRT.lib(crtexe.obj) 中引用 1> 在 MSVCRT.lib(atonexit.obj) 中引用 1> 加载 kernel32.lib(KERNEL32.dll) 1> 找到 __imp__TerminateProcess@8 1> 在 MSVCRT.lib(gs_report. obj) 1> 加载 kernel32.lib(KERNEL32.dll) 1> 找到 __imp__GetCurrentProcess@0 1> 在 MSVCRT.lib(gs_report.obj) 中引用 1> 加载 kernel32.lib(KERNEL32.dll) 1> 找到 __imp__UnhandledExceptionFilter@4 1>在 MSVCRT.lib(gs_report.obj) 中引用 1> 加载 kernel32.lib(KERNEL32.dll) 1> 找到 __imp__SetUnhandledExceptionFilter@4 1> 在 MSVCRT.lib(gs_report.obj) 中引用 1> 在 MSVCRT.lib(unhandld.obj) 中引用) 1> 加载d kernel32.lib(KERNEL32.dll) 1> 找到 __imp__IsDebuggerPresent@0 1> 在 MSVCRT.lib(gs_report.obj) 中引用 1> 加载 kernel32.lib(KERNEL32.dll) 1> 找到 __imp__DecodePointer@4 1> 在 MSVCRT 中引用。 lib(atonexit.obj) 1> 加载 kernel32.lib(KERNEL32.dll) 1> 找到 __imp__QueryPerformanceCounter@4 1> 在 MSVCRT.lib(gs_support.obj) 中引用 1> 加载 kernel32.lib(KERNEL32.dll) 1> 找到 __imp__GetTickCount @0 1> 在 MSVCRT.lib(gs_support.obj) 中引用 1> 加载 kernel32.lib(KERNEL32.dll) 1> 找到 __imp__GetCurrentThreadId@0 1> 在 MSVCRT.lib(gs_support.obj) 中引用 1> 加载 kernel32.lib( KERNEL32.dll) 1> 找到 __imp__GetCurrentProcessId@0 1> 在 MSVCRT.lib(gs_support.obj) 中引用 1> 加载 kernel32.lib(KERNEL32.dll) 1> 找到 __imp__GetSystemTimeAsFileTime@4 1> 在 MSVCRT.lib(gs_support.obj 中引用) 1> 加载 kernel32.lib(KERNEL32.dll) 1> 找到 __IMPORT_DESCRIPTOR_KERNEL32 1> 在 kernel32.lib(KERNEL32.dll) 中引用 1> 在 kernel32.lib(KERNEL32.dll) 中引用 1> 在内核中引用32.lib(KERNEL32.dll) 1> 在 kernel32.lib(KERNEL32.dll) 中引用 1> 在 kernel32.lib(KERNEL32.dll) 中引用 1> 在 kernel32.lib(KERNEL32.dll) 中引用 1> 在 kernel32 中引用。 lib(KERNEL32.dll) 1> 在 kernel32.lib(KERNEL32.dll) 中引用 1> 在 kernel32.lib(KERNEL32.dll) 中引用 1> 在 kernel32.lib(KERNEL32.dll) 中引用 1> 在 kernel32.lib( KERNEL32.dll) 1> 在 kernel32.lib(KERNEL32.dll) 中引用 1> 在 kernel32.lib(KERNEL32.dll) 中引用 1> 在 kernel32.lib(KERNEL32.dll) 中引用 1> 在 kernel32.lib(KERNEL32. dll) 1> 在 kernel32.lib(KERNEL32.dll) 中引用 1> 加载 kernel32.lib(KERNEL32.dll) 1> 找到 KERNEL32_NULL_THUNK_DATA 1> 在 kernel32.lib(KERNEL32.dll) 中引用 1> 加载 kernel32.lib(KERNEL32. dll) 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\user32.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\gdi32.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\winspool.lib: 1> 搜索 C:\Program Files \Microsoft SDKs\Windows\v7.0A\lib\comdlg32.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\advapi32.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\shell32.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\ole32.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\ Windows\v7.0A\lib\oleaut32.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\uuid.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\ v7.0A\lib\odbc32.lib: 1> 搜索 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\odbccp32.lib: 1> 搜索 C:\Program Files\Microsoft Visual Studio 10.0\VC\ lib\msvcprt.lib: 1> 搜索 C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\MSVCRT.lib: 1> 搜索 C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\OLDNAMES.lib: 1> 搜索 C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\zlib.lib: 1>
1> 完成检索库 1>
1> 完成传球 1 1>
1>SBRapGen2.obj:错误 LNK2001:未解析的外部符号 _deflateEnd 1>SBRapGen2.obj:错误 LNK2001:未解析的外部符号 inflateInit2 1>SBRapGen2.obj:错误 LNK2001:未解析的外部符号 _inflate 1>SBRapGen2.obj:错误 LNK2001:未解析的外部符号 _inflateEnd 1>SBRapGen2.obj:错误 LNK2001:未解析的外部符号 _deflate 1>SBRapGen2.obj:错误 LNK2001:未解析的外部符号 deflateInit2
原文由 RSuthke 发布,翻译遵循 CC BY-SA 4.0 许可协议
就我而言,在 vs2017 中使用 NuGet 安装
zlib-vc140-static-64
(v1.2.11) 或zlib_native
(v1.2.11)。