Неразрешенные внешние файлы, несмотря на ссылку в zlib.lib

Я пытался скомпилировать приложение, использующее сжатие zlib в VC++ 2010.

я получаю

error LNK2019: unresolved external symbol _inflateInit2_ referenced in function ...

сообщение об ошибке, что не было бы необычным, если бы я не связал файл lib. Я связываю статическую библиотеку 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

ОБНОВЛЕНИЕ 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_

person RSuthke    schedule 24.03.2011    source источник
comment
Что делает подчеркивание в конце _inflateInit2_ ? Может быть, это проблема.   -  person TonyK    schedule 25.03.2011
comment
@TonyK: DUMPBIN сообщает, что символ в .lib существует с обоими символами подчеркивания.   -  person RSuthke    schedule 25.03.2011
comment
Нашел эту ссылку, чтобы быть полезным для меня. Работает как часы: tannerhelland.com/5076/compile-zlib- winapi-wapi-stdcall   -  person Dula    schedule 19.02.2014


Ответы (8)


Если вы используете решение VS2010, представленное в contrib/, имейте в виду, что оно содержит ошибки. Проект zlibstat определяет ZLIB_WINAPI, который согласно часто задаваемым вопросам по zlib используется для включения соглашения STDCALL. Просто удалите его из настроек проекта и перекомпилируйте lib.

person Hook    schedule 02.07.2011
comment
+1 Также обратите внимание, что вы также можете решить проблему, определив ZLIB_WINAPI и в основном проекте. - person MerickOWA; 25.08.2011
comment
Добрый бог спасибо! Сопровождающие действительно должны решить эту проблему. - person Ben; 26.01.2012
comment
Спасатель жизни, потребовалась бы целая вечность, чтобы заметить это - person paulm; 01.02.2015
comment
@MerickOWA: что именно вы имеете в виду, когда вы также можете решить проблему, определив ZLIB_WINAPI и в основном проекте? А можно поточнее? - person Magallo; 23.04.2015
comment
@Magallo, вы могли бы #определить ZLIB_WINAPI непосредственно перед тем, как #включить zlib.h - person MerickOWA; 23.04.2015
comment
Это действительно должен быть принятый ответ. Это сэкономило мне много времени. - person Michael Calvin; 02.06.2015
comment
это должно быть в FAQ по Tesseract/leptonica/zlib - person Robson; 07.09.2017

В моем случае я исправил

  • Конфигурация -> Компоновщик -> Ввод -> Дополнительные зависимости

читать ucrt.lib;vcruntime.lib;msvcrt.lib;kernel32.lib

Это позволило libz собирать под Windows 10 с VS2015.

Обеспечение типа сборки /MD

Это также имело место при сборке для libpng (для чего требуется zlib), те же модификации обеспечивают успешную сборку со старыми включенными файлами «проектов» по ​​умолчанию.

person twobob    schedule 24.07.2016
comment
Супер круто, я потратил 2 дня на его сборку для ARM64. Этот решил мою проблему. Спасибо - person P3A; 08.04.2020

Несколько советов наугад:

Попробуйте запустить dumpbin /symbols zlib.lib, чтобы убедиться, что символы в этой библиотеке соответствуют вашим ожиданиям (т. е. есть ли там inflateInit2?).

Если сборка в настоящее время использует поиск пути к библиотеке для поиска zlib.lib, попробуйте указать полный абсолютный путь к библиотеке, чтобы исключить возможность обнаружения компоновщиком какой-либо устаревшей библиотеки zlib где-то еще в вашей системе.

Кроме того, опубликуйте командную строку, используемую для компоновщика (из файла журнала сборки).

Обновлять:

Такое поведение можно наблюдать, если вы случайно смешиваете 32-битные и 64-битные компоненты (т. е. файл zlib.lib создан для x86, а приложение — для x64). Компоновщик не жалуется на отсутствие файла lib и не жалуется на то, что объекты в файле lib предназначены для другой платформы. Учитывая, что в вашем сообщении об ошибке упоминается символ без какого-либо оформления, могу поспорить, что компоновщик создает приложение x64, но, возможно, в zlib.lib есть объекты x86 (и, следовательно, там есть символ с именем _inflateInit2, украшенный символом подчеркивания или может быть, что-то еще).

(Кроме того, мне интересно, можно ли смешивать объекты x86 и x64 в одном и том же файле lib, если они имеют разные имена. Не то чтобы я действительно хотел это сделать).

person Michael Burr    schedule 24.03.2011
comment
Кажется, что все необходимые символы присутствуют, поскольку используется dumpbin (это также подтверждается тем фактом, что я могу прямо сейчас скомпилировать другой проект, используя те же библиотеки). - person RSuthke; 24.03.2011
comment
@Michael: Проверено, оба x86 - person RSuthke; 25.03.2011
comment
@RSuthke: в таком случае интересно, что в имени в сообщении об ошибке нет префикса «_» или «@», поскольку соглашения о вызовах MSVC для x86 должны добавлять один из этих префиксов, если я не ошибаюсь (и вызов x64 соглашение не использует префикс). - person Michael Burr; 25.03.2011
comment
@Michael: Плохо, я написал код по памяти, точный код выглядит следующим образом: ` 1›zlibwrap.obj : ошибка LNK2019: неразрешенный внешний символ inflateInit2, на который ссылается функция public: unsigned long __thiscall CZLibWrap ::DecompressBuffer(unsigned char *,unsigned long,unsigned char *,unsigned long) (?DecompressBuffer@CZLibWrap@@QAEKPAEK0K@Z)` ОБНОВЛЕНИЕ: На самом деле, это подчеркивание было, но программное обеспечение этого сайта конвертирует парные подчеркивания в курсив. - person RSuthke; 25.03.2011
comment
@RSuthke: ОК, я должен был подумать, что может быть что-то не так с форматированием из-за курсива ... Итак, символ, который не найден, это: _inflateInit2_ с подчеркиванием в начале и конце, верно? Кстати, вы можете форматировать фрагменты кода, заключая код в символы обратной кавычки или устанавливая отступ блоков кода на 4 или более пробела (что не работает для комментариев). - person Michael Burr; 25.03.2011
comment
@MIchael: _inflateInit2_ это так. - person RSuthke; 25.03.2011
comment
@RSuthke: я думаю, что я в тупике. Может быть, публикация командной строки компоновщика даст подсказку? - person Michael Burr; 25.03.2011
comment
@RSuthke: я забыл об опции /VERBOSE для компоновщика - это может показать что-то интересное. - person Michael Burr; 25.03.2011
comment
@Michael: Извините за задержку, я только сейчас добрался до машины с кодом. Подробный вывод по запросу. - person RSuthke; 25.03.2011

в моем случае установите zlib-vc140-static-64 (v1.2.11) или zlib_native (v1.2.11), используя NuGet в vs2017.

person sailfish009    schedule 05.09.2019
comment
Это решение также работает для VS2019. - person Jacob Krieg; 09.06.2021

Вы убедились, что ваши прототипы функций zlib находятся в блоке extern "C"? Если нет, то компоновщик будет искать функции с измененными именами C++, а zlib.lib будет содержать неизмененные имена C.

person Josh Kelley    schedule 24.03.2011
comment
Все прототипы функций находятся во внешнем блоке C в соответствии со стандартным заголовком zlib.h. - person RSuthke; 24.03.2011

Вы скомпилировали статическую библиотеку zlib не с помощью VC++ 2010?

Это недавнее обновление с VS2008/05?

Вы пытались перекомпилировать статическую библиотеку с помощью набора инструментов 2010 года?

person J T    schedule 24.03.2011
comment
Эта библиотека соответствует той же версии VC++ 2010, которая используется для компиляции проекта. Он также успешно использовался для компиляции других проектов с использованием идентичного кода обработки zlib. - person RSuthke; 24.03.2011

Имейте в виду, что порядок библиотек имеет значение. Предположим, вы хотите связать A.OBJ, B.LIB и C.LIB с входными файлами, указанными в этом порядке. Если C.LIB вызывает функцию из B.LIB, она не будет найдена (если только она уже не была случайно вызвана из A.OBJ).
Может ли это быть источником вашей проблемы?

person TonyK    schedule 24.03.2011
comment
Маловероятно. У меня точно такая же структура кода в других проектах, которые легко компилируются и связываются. - person RSuthke; 25.03.2011
comment
Хотя я помню, что компоновщик, по крайней мере, раньше вел себя так, как описывает TonyK, согласно этой документации MSDN, компоновщик вернется к поиску предыдущих файлов .lib: msdn.microsoft.com/en-us/library/hcce369f.aspx . Я все еще думаю, что проверка этого была бы хорошей идеей, поскольку я почти уверен, что инструменты MS раньше вели себя так, как описывает TonyK, поэтому, возможно, есть тонкость, о которой документы неясны. - person Michael Burr; 25.03.2011
comment
Я сократил код до одного .cpp для теста (поэтому нужен только один .obj), проблемы со ссылками сохраняются. - person RSuthke; 25.03.2011

Я сам столкнулся с той же проблемой, используя 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

Я последовал совету Майкла Берра, проверив, содержит ли файл zlib эти методы:

dumpbin /symbols zlib.lib

Вывод показал, что методы были, но Visual Studio по-прежнему жаловалась. В конце концов я загрузил последнюю стабильную версию zlib из их репозитория на github, а затем скомпилировал ее (используя консоль разработчика Visual Studio). Их инструкции не были напрямую полезны, хотя в конце концов я нашел их MS Makefile, который содержал команду, которую мне нужно было запустить.

nmake -f win32/Makefile.msc

Загляните в их файл win32/Makefile.msc для получения дополнительной информации о процессе сборки.

В процессе сборки было создано два файла .lib. Что мне действительно было нужно в моем проекте, так это 'zdll.lib'. (Информацию об этом см. в файле документации DLL_FAQ.txt). Вернувшись в Visual Studio, мне пришлось вручную добавить файл в мой проект (НЕ с помощью метода Linker --> General --> Additional Library Directories, так как это вызвало другие проблемы). Вы можете добавить их, нажав Right -Нажатие на объект решения (не самый верхний элемент в списке, а второй элемент. На рисунке ниже мой проект называется Lasso, поэтому вы можете щелкнуть эквивалент в своем проекте.)

Перейдите к: Добавить --> Существующий элемент...

Затем выберите сгенерированный файл zdll.lib.

Файлы библиотеки, явно добавленные в проект Visual Studio

person C.D.    schedule 19.02.2019