Как устранить ошибку 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)" (?close@CppSQLite3DB@@QAEXXZ 
   referenced in function "public: int __thiscall
   CTalkingFeedsDB::AddFeedToDB(class CFeed,char const*)" (?
   AddFeedToDB@CTalkingFeedsDB@@QAEHVCFeed@@PDB@Z

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


person Attilah    schedule 11.05.2009    source источник


Ответы (6)


Со мной не раз случалось, что я думал, что символ XXX (т.е. ?close@CppSQLite3DB@@QAEXXZ) был в библиотеке импорта, тогда как фактический символ был __impXXX (т.е. __imp?close@CppSQLite3DB@@QAEXXZ).

Тогда причина ошибки компоновщика должна быть найдена на этапе компиляции: компилятор сгенерирует импортируемый символ ?close@CppSQLite3DB@@QAEXXZ, где он должен сгенерировать __imp?close@CppSQLite3DB@@QAEXXZ. Это часто означает, что в самом объявлении функции не было __declspec( dllimport ). Это может быть вызвано тем, что какой-то символ препроцессора не определен. Или __declspec там вообще нет...

person xtofl    schedule 12.05.2009
comment
Отвечает ли это на заданный вопрос? - person ST3; 15.10.2013
comment
@ST3: по-видимому, это решило этот конкретный случай. Это не общий рецепт устранения ошибок компоновщика, если вы это имеете в виду. - person xtofl; 16.10.2013
comment
Да, добавление этой строки решило и мою (похожую) проблему. На самом деле происходит то, что некоторым проектам нужен символ, определенный в другой dll, которая не экспортируется (обычно MSVS). - person mr_T; 08.10.2014

Я знаю, что с этого вопроса прошло уже 2 года... но я здесь в такой же ситуации. Добавлены все файлы заголовков... добавлены каталоги lib... и эта ошибка сохраняется. Поэтому я вручную добавил библиотеку в Свойства конфигурации -> Компоновщик -> Ввод -> Дополнительные зависимости, и все работает для меня.

person Luis Eduardo    schedule 28.06.2011
comment
Отлично, спасибо за хороший ответ, ошибка компоновщика связана с зависимостью - person Milind Morey; 14.03.2014

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

person Ago    schedule 05.05.2011

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

person MickaelFM    schedule 11.05.2009
comment
в проекте библиотеки я перешел к проекту->свойства->Свойства конфигурации->Библиотека->Общие->Дополнительные зависимости и добавил к нему ..\SQLiteCommon\sqlite3.lib. - person Attilah; 11.05.2009
comment
Вы связали его статически (как вы его скомпилировали)? - person MickaelFM; 11.05.2009
comment
да, я подключил его статически, я думаю. но странно то, что, как и в других типах проектов, я не вижу вкладку Linker в Project Properties->Configuration properties, вместо этого я вижу Librarian. - person Attilah; 11.05.2009

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

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

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

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

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

person xtofl    schedule 11.05.2009
comment
lib(sqlite.lib) экспортирует символы. Я добавил библиотеку в свой основной проект, но она все равно не работает. я все еще получаю те же ошибки. - person Attilah; 12.05.2009

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

person Mark Ransom    schedule 12.05.2009