Как я могу устранить «ошибку LNK2019:неразрешенный внешний символ»?[дубликат]
-
21-08-2019 - |
Вопрос
На этот вопрос уже есть ответ здесь:
У меня есть приложение MFC, над которым я работаю, и которое должно иметь встроенную базу данных.Поэтому я отправился на поиски удобной и быстрой «встраиваемой» базы данных и наткнулся на SQLite.
Я создал с его помощью БД и проект статической библиотеки с помощью Visual Studio 2008.проект библиотеки будет использоваться в другом основном проекте.
В проекте библиотеки я создал класс DBClass
с методом AddFeedToDB(CFeed f)
.В проекте библиотеки используется .lib
файл из кодпроекта (cppsqlite3.lib
).
При компиляции статической библиотеки ошибок не обнаружено, но когда я пытаюсь использовать файл проекта библиотеки в основном проекте, я получаю ошибки такого типа:
error LNK2019: unresolved external symbol "public:void __thiscall
CppSQLite3DB::close(void)" (?close@CppSQLite3DB@@QAEXXZ
referenced in function "public: int __thiscall
CTalkingFeedsDB::AddFeedToDB(class CFeed,char const*)" (?
AddFeedToDB@CTalkingFeedsDB@@QAEHVCFeed@@PDB@Z
Что мне не хватает?
Решение
Со мной не раз случалось, что я думал, что символ XXX
(т.е. ?close@CppSQLite3DB@@QAEXXZ
) был в библиотеке импорта, в то время как фактический символ был __impXXX
(т.е. __imp?close@CppSQLite3DB@@QAEXXZ
).
Причину ошибки компоновщика можно найти на этапе компиляции:компилятор сгенерирует ?close@CppSQLite3DB@@QAEXXZ
символ, который нужно импортировать, где он должен генерировать __imp?close@CppSQLite3DB@@QAEXXZ
.Это часто означает, что само объявление функции не имело __declspec( dllimport )
.Это может быть вызвано тем, что какой-то символ препроцессора не определен.Или __declspec
вообще не быть там...
Другие советы
Я знаю, что прошло уже 2 года с момента этого вопроса...но я здесь в такой же ситуации.Добавил все заголовочные файлы...добавил каталоги lib..и продолжайте эту ошибку.Поэтому я вручную добавил библиотеку в Свойства конфигурации -> Компоновщик -> Ввод -> Дополнительные зависимости И все работает на меня.
Не знаю, ваш ли это случай, но префиксimp может означать, что вы компилируете библиотеку x64 в проекте Win32.
Вам нужно либо связать библиотеку SQLite codeproject с вашим исполняемым файлом, либо напрямую включить исходные файлы в ваш проект.(Какой из них вы сделали?)
Я бы выполнил следующие шаги:
подумайте, в какую библиотеку или файл .obj вы ожидаете, что символ будет экспортирован.
проверь, действительно ли это делает экспортируйте этот самый символ (проверяйте посимвольно).Иногда соглашение о вызовах отличается.
проверьте, известна ли компоновщику библиотека, в которой вы ожидаете содержать символ. Сначала проверьте наличие «дополнительных библиотек», затем проверьте, действительно ли библиотека найдена (в основном я делаю это с помощью filemon.exe из sysinternals и ищу ссылку .exe, чтобы открыть файл lib.)
Подумав некоторое время, вы можете обнаружить, что ваш библиотечный проект будет нет экспортируйте искомую функцию.Эта функция находится в базе данных lib.Вам следует добавить эту библиотеку в свой основной проект.Бесполезно добавлять его в ваш проект статической библиотеки.
Компилятор и компоновщик не будут связывать одну библиотеку с другой (если только она не является DLL).Вам необходимо указать обе библиотеки (cppsqlite3.lib и вашу собственную статическую библиотеку) в вашем основном проекте.