2016-11-10 3 views
0

Я не могу понять, как получить sqlite3.dll (или любую DLL, если на то пошло) для работы с моим проектом C++ в Visual Studio.Visual Studio 2015 (C++) sqlite3.dll неразрешенный внешний символ

Сообщение об ошибке я получаю LNK2001 неразрешенный внешний символ sqlite3_open

Вот что я сделал до сих пор:

  • Я поставил .dll в myProjectFoler/Resources/sqlite3.dll
  • Я сгенерировал sqlite3.lib с помощью командной строки Visual Studio Developer Command с помощью команды lib /def:sqlite3.def
  • Я ссылался на каталог с lib в P РОЕКТ -> Настройки -> Linker -> Общие -> Дополнительные каталоги библиотек, а затем ссылаться на .lib в Project -> Настройки -> Linker -> Вход-> Дополнительные зависимости
  • я поместил sqlite3.h в моем проект и #included его

(в значительной степени следовали инструкциям увиденные here)

Благодарим вас за помощь

ответ

3

проблема в том, что по умолчанию файл заголовка предполагается, что SQLite связан статически, в отличие от динамической привязки к dll.

Эта часть sqlite3.h отвечает за что:

#ifndef SQLITE_API 
# define SQLITE_API 
#endif 

Если вы установите для каждого проекта определяют в свойствах проекта:

SQLITE_API=__declspec(dllimport) 

это должно устранить ошибку связи. Кроме того, вы можете поместить

#define SQLITE_API __declspec(dllimport) 

прямо перед тем, где вы #include sqlite3.h.

+0

Я не уверен, что вы подразумеваете под проектом, но добавляете код, который вы указали до #include sqlite3.h, к сожалению, не работает – finrod

+0

Неплохо, должно быть __declspec (dllimport) –

+0

Спасибо за быстрый ответ, но он по-прежнему производит ту же ошибку ** edit: ** Единственное различие заключается в том, что теперь он говорит ** __ imp_sqlite3_open ** вместо просто ** sqlite3_open ** – finrod

0

Трудно точно сказать, почему возникла проблема. Существует множество причин, которые могут вызвать ошибку LNK2001. MSDN содержит хороший контрольный список.

Вы можете попытаться использовать опцию /VERBOSE, чтобы определить, какие файлы ссылки компоновщика. Поставьте эту опцию в Project -> Preferences -> Linker -> Command Line -> Additional Options. Вывод должна содержать подобные строки:

Searching e:\SQLite\sqlite-dll-win32-x86-3150100\sqlite3.lib: 
     Found _sqlite3_open 
     Referenced in ConsoleApplication2.obj 
     Loaded sqlite3.lib(sqlite3.dll) 

Обратите внимание на библиотеки времени выполнения VS, там не должно быть путаница между Debug и Release библиотеки.

+0

Итак, я добавил подробный вариант, и я предполагаю, что если он не " t сказать 'found' после path/sqlite3.lib, он не загрузил его. Но я не понимаю, путь определенно правильный. – finrod

+0

@finrod Я добавил данные компоновщика для случая успеха. В другом случае дважды проверьте конфигурацию компоновщика. Вы создаете ту же конфигурацию, что и вы, например, Отладка и создание Debug? – Nikita

+0

Я тройной проверил конфигурацию компоновщика, и я установил его для всех конфигураций. Тем временем я добавил sqlite3.c в свой проект. Это делает сборку немного дольше, но по крайней мере она работает. Я бы хотел это выяснить. Спасибо за попытку. – finrod

Смежные вопросы