Как разрешить "ошибку 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 и собственную статическую библиотеку) в вашем основном проекте.