Как разрешить "ошибку LNK2019: неразрешенный внешний символ"?

У меня есть приложение MFC, над которым я работаю, для чего нужна встроенная база данных. Поэтому я отправился на поиски пятнистой, быстрой "встраиваемой" базы данных для нее и наткнулся на SQLite.

Я создал с ним БД, и я создал проект статической библиотеки с Visual Studio 2008. проект библиотеки будет использоваться в другом главном проекте.

В проекте библиотеки я создал класс DBClass с помощью метода AddFeedToDB(CFeed f). Проект библиотеки использует файл .lib из codeproject (cppsqlite3.lib).

При компиляции статической библиотеки ошибка не обнаружена, но когда я пытаюсь использовать файл проекта библиотеки в основном проекте, я получаю такие типы ошибок:

error LNK2019: unresolved external symbol "public:void __thiscall
   CppSQLite3DB::close(void)" ([email protected]@@QAEXXZ 
   referenced in function "public: int __thiscall
   CTalkingFeedsDB::AddFeedToDB(class CFeed,char const*)" (?
   [email protected]@@[email protected]@[email protected]

Что мне не хватает?

Ответы

Ответ 1

Случилось со мной несколько раз, что я думал, что символ XXX (т.е. [email protected]@@QAEXXZ) был в lib lib, тогда как фактический символ был __impXXX (т.е. [email protected]@@QAEXXZ).

Причиной ошибки компоновщика следует найти на этапе компиляции: компилятор будет генерировать символ [email protected]@@QAEXXZ, который должен быть импортирован, где он должен генерировать [email protected]@@QAEXXZ. Это часто означает, что сама декларация функции не имела __declspec( dllimport ). Это может быть вызвано тем, что некоторый символ препроцессора не определен. Или __declspec не существует вообще...

Ответ 2

Я знаю, что уже 2 года с этого вопроса... но я бегу в той же ситуации здесь. Добавлены все файлы заголовков... добавлены каталоги lib.. и продолжайте иметь эту ошибку. Поэтому я добавил вручную lib в Свойства конфигурации → Linker → Input → Aditional Dependencies и все работает для меня.

Ответ 3

Не знаю, является ли это ваш случай, но префикс imp может означать, что вы компилируете библиотеку x64 в проекте Win32.

Ответ 4

Вам либо нужно связать codecroject SQLite lib с вашим исполняемым файлом, либо напрямую включить исходные файлы в свой проект. (Какой из них вы делали?)

Ответ 5

Я бы выполнил следующие шаги:

  • подумайте о том, какую библиотеку или файл .obj вы ожидаете экспортировать символ.

  • проверьте, действительно ли он экспортирует этот самый символ (проверьте символ). Иногда это означает, что вызывающее соглашение отличается.

  • проверить, что библиотека, которую вы ожидаете содержать символ, известна компоновщику - сначала проверьте наличие дополнительных библиотек, затем проверьте, действительно ли библиотека найдена (в основном я делаю это с помощью filemon.exe из sysinternals и найдите файл link.exe, чтобы открыть файл lib.)

Подумав некоторое время, вы можете обнаружить, что проект библиотеки не будет экспортировать искомую функцию. Эта функция находится в базе данных lib. Вы должны добавить этот lib в свой основной проект. Не нужно добавлять его в свой статический проект lib.

Ответ 6

Компилятор и компоновщик не свяжут одну библиотеку с другой (если она не является DLL). Вам нужно указать обе библиотеки (cppsqlite3.lib и собственную статическую библиотеку) в вашем основном проекте.