Как включить SQLite DLL в мой проект на С++?

Я пытаюсь добавить SQLite в свой проект через DLL.

Я загрузил SQLiteDLL-3 из страницу загрузки, извлек ее содержимое (DLL и файл .h), и запустил lib.exe для создания файла .lib. Затем я устанавливаю каталог, содержащий файлы .lib и .dll в качестве дополнительного каталога библиотек, в настройках проекта в разделе Linker → General.

Затем я загрузил SQLiteSource-3 со страницы загрузки и извлек файл SQLite3.h в каталог с файлами .Lib и .DLL и добавил этот каталог в качестве дополнительного каталога Include в разделе C/С++ → General. Я добавил #include в свой основной файл, а затем добавил sqlite3.dll в качестве дополнительной зависимости в компоновщике → Вход.

В основном я следил за this, но когда я запускаю его, я получаю сообщение об ошибке:

fatal error LNK1107: invalid or corrupt file: cannot read at 0x2B8

Я испробовал ряд исправлений, включая создание файла .lib под x86 и x64 и включая полный путь к .lib файлу в списке дополнительных зависимостей. Это всегда то, что я получаю. Кажется, что, по крайней мере, я нашел файл .h, потому что, если я использую имя в include, я получаю ошибку "не могу найти файл", поэтому эта часть выглядит правильно.

Может ли кто-нибудь увидеть, что я могу делать неправильно и как исправить проблему?

Update: Исправлена ​​проблема с недопустимым или поврежденным файлом, добавив файл .lib в список дополнительных зависимостей, а не файл .dll. Теперь я получаю неразрешенные ошибки компоновщика:

ошибка LNK2019: нерешенный внешний символ _sqlite3_exec, указанный в функции _main

ошибка LNK2019: нерешенный внешний символ _sqlite3_open, указанный в функции _main

фатальная ошибка LNK1120: 2 нерешенных внешних

Ответ 1

Вот что сработало для меня:

В Visual Studio 2010 нажмите "Инструменты, командная строка VS"

В окне командной строки введите, например:

lib /DEF:"C:\SQLite\sqlite3.def" /OUT:"C:\SQLite\sqlite3.lib"

В окне обозревателя решений щелкните правой кнопкой мыши по вашему проекту, добавьте файл "sqlite3.lib".

(Можно подумать, что банда SQLite может включать .lib в загрузку?)

Ответ 2

Если я помню, что правильный sqlite написан на C. Имеет ли файл sqlite3.h

extern "C" {}

упаковка объявлений? Возможно, у вас возникла проблема name mangling.

Ответ 3

Обновление: SQLite 3.28 не поставляется с файлом .DEF. Чтобы создать DEF и LIB, выполните:

:: Dump SQLite.DLL exports

set DUMPBIN="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x86\dumpbin.exe"
set LIBX="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x86\lib.exe"
set SQL="C:\SQLite\sqlite3.dll"
set DEF="C:\SQLite\sqlite3.def"
set LIB="C:\SQLite\sqlite3.lib"

:: [1] run dumpbin
%DUMPBIN% /EXPORTS /NOLOGO /OUT:%DEF% %SQL%

:: [2] manually edit .DEF file to look proper
:: [3] run LIB
%LIBX% /DEF:%DEF% /OUT:%LIB%