Моя программа (VS 2010) использует протокол Google Buffer Protocol, скомпилированный с включенной опцией HAVE_ZLIB
. Я скомпилировал последнюю версию zlib
и добавил .lib
в свой проект, но во время связывания все равно получил
1> libprotobuf.lib (gzip_stream.obj): ошибка LNK2001: неразрешенный внешний символ _inflateEnd 1> libprotobuf.lib (gzip_stream.obj): ошибка LNK2001: неразрешенный внешний символ inflateInit2 1> libprotobuf.lib (gzip_stream .obj): ошибка LNK2001: неразрешенный внешний символ _inflate 1> libprotobuf.lib (gzip_stream.obj): ошибка LNK2001: неразрешенный внешний символ deflateInit2 1> libprotobuf.lib (gzip_stream.obj): ошибка LNK2001: неразрешенный внешний символ _deflate 1> libprotobuf.lib (gzip_stream.obj): ошибка LNK2001: неразрешенный внешний символ _deflateEnd
Я использовал dumpbin.exe /all zlib.lib
, там написано:
Тип файла: БИБЛИОТЕКА
.... 245 public symbols .... 4DBE __imp__inflateInit2_@16 4DBE _inflateInit2_@16
также в этом списке есть другие неразрешенные символы.
Что тогда не так? Почему компоновщик не может найти эти функции?
upd: после перекомпиляции zlib
теперь __imp__inflateInit2_@4
__stdcall
в качестве соглашения о вызовах по умолчанию при сборке zlib (возможно, с/Gz
переключателем компилятора), в то время как вызывающий код ожидает старый добрый__cdecl
. - person Igor Tandetnik   schedule 13.09.2013__cdecl
, нет опции/Gz
в аргументах командной строки - person fogbit   schedule 13.09.2013@16
является контрольным признаком искажения имени стандартного вызова. Еще одно, что нужно проверить: возможно, функции объявлены как-то вродеvoid ZLIBAPI inflateEnd(...)
, и макросZLIBAPI
в конечном итоге расширяется до__stdcall
в одном месте, но до__cdecl
в другом. - person Igor Tandetnik   schedule 13.09.2013_inflateEnd@4
, а не@16
- person fogbit   schedule 13.09.2013inflateInit2
, а не наinflateEnd
. Число после знака @ - это общее количество байтов, необходимых для всех параметров функции, поэтому, естественно, оно может быть разным для разных функций. Опять же, именно так работает украшение имени __stdcall (см. Раздел «Украшение имени» в этого документа а>) - person Igor Tandetnik   schedule 13.09.2013