Я пытаюсь построить свой проект с использованием MS Visual Studio 2010 с помощью библиотеки распаковки Info-ZIP. Когда я вставил UzpVersion()
вызов в коде, компоновщик не сказал:
ошибка LNK2019: неразрешенный внешний символ _UzpVersion, указанный в функции _wmain
DUMPBIN показывает, что библиотека экспортирует _UzpVersion@0
(он был скомпилирован с тем же компилятором). Но объектный файл запрашивает _UzpVersion
, Функция объявлена как:
extern "C" {
const UzpVer * UzpVersion(void);
}
Что с этим не так? Как это исправить? Извините, я не очень разбираюсь в Visual C ++; Я провел большую часть своего времени с GNU C ++.
Это ошибка связи. Компилятор видит объявление UzpVersion, иначе он не смог бы скомпилироваться. Вы должны убедиться, что вы настроили свой проект для включения .lib.
РЕДАКТИРОВАТЬ: Кроме того, вы сказали, что вы собираете его самостоятельно. Убедитесь, что вы компилируете исходники как C, а не C ++.
Разобрался сам.
Библиотека скомпилирована с __stdcall
соглашение о вызовах, но не объявляет экспортируемые функции как таковые. Visual Studio 2010 по умолчанию компилирует проект с /Gd
флаг, который переключается на __cdecl
Соглашение о вызовах. Помимо прочего, в этих соглашениях о вызовах также используются различные схемы искажения имен для функций C.
Ты можешь читать подробности о MSDN.
В частности, для библиотеки Info-ZIP проблема устраняется путем добавления следующих определений перед включением unzip.h
заголовок:
#define EXPENTRY __stdcall
#define USE_UNZIP_LIB