Как я могу устранить «ошибку LNK2019:неразрешенный внешний символ»?[дубликат]

StackOverflow https://stackoverflow.com/questions/849238

Вопрос

У меня есть приложение 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 с вашим исполняемым файлом, либо напрямую включить исходные файлы в ваш проект.(Какой из них вы сделали?)

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top