2010-10-08 7 views
9

J'essaie d'ajouter SQLite à mon projet via une DLL.Comment inclure une DLL SQLite dans mon projet C++?

J'ai téléchargé SQLiteDLL-3 à partir du download page, extrait son contenu (une DLL et un fichier .h), et ai exécuté lib.exe dessus pour produire un fichier .lib. J'ai ensuite défini le répertoire contenant les fichiers .lib et .dll comme répertoire de bibliothèque supplémentaire, dans les paramètres du projet, sous Lier >> Général. Puis j'ai téléchargé SQLiteSource-3 à partir de la page de téléchargement, et extrait le fichier SQLite3.h dans le répertoire avec les fichiers .Lib et .DLL, et ajouté ce répertoire en tant que répertoire d'inclusion supplémentaire sous C/C++ >> Général . J'ai ajouté #include à mon fichier principal, puis ajouté sqlite3.dll en tant que dépendance supplémentaire dans Linker >> Input.

Fondamentalement, je suivis this, mais quand je le lance, je reçois une erreur disant:

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

J'ai essayé un certain nombre de choses à corriger, y compris la construction du fichier .lib sous x86 et x64, et en incluant le chemin d'accès complet au fichier .lib dans la liste Dépendances supplémentaires. C'est toujours cette erreur que je reçois. Il semble au moins trouver le fichier .h correct, parce que si je plaisante avec le nom dans l'include, j'obtiens une erreur "impossible de trouver le fichier", donc cette partie semble être correcte. Est-ce que quelqu'un peut voir ce que je peux mal faire et comment corriger le problème?

Mise à jour: Correction du problème « de fichier non valide ou corrompu » en ajoutant le fichier .lib à la liste des Dependies supplémentaires, par opposition au fichier .dll. Maintenant, je reçois des erreurs de l'éditeur de liens non résolus:

erreur LNK2019: symbole externe non résolu _sqlite3_exec référencé dans la fonction _main

erreur LNK2019: symbole externe non résolu _sqlite3_open référencé dans la fonction _main

LNK1120 erreur fatale: 2 externals non résolues

+6

vous ajoutez le fichier .lib comme entrée de liaison, pas le fichier .dll. – Blindy

+1

Cela a résolu cette erreur. Je vous remercie. Maintenant, je reçois des erreurs de liens de symboles externes non résolues pour chaque appel à une fonction SQLite. Les fonctions apparaissent dans intellisense, si cela compte à tous. –

+0

Quel est l'un des symboles manquants? (Devrait dire dans l'erreur) – dgnorton

Répondre

1

Si je me souviens sqlite droit est écrit en C. est-ce que le fichier sqlite3.h ont

extern "C" {} 

Enveloppant les déclarations? Vous pourriez avoir des problèmes name mangling.

+0

Il le fait en effet. Des suggestions pour une solution? –

+0

Lorsque vous exécutez le programme, le fichier dll doit se trouver dans le même répertoire que l'exécutable ou dans le répertoire Windows. (Le fichier lib ne le fait pas) – Jay

+0

Sur vos problèmes de compilation: Je pense que vous utilisez netbeans comme un IDE? Vous avez mis dans le répertoire où le fichier lib peut être trouvé mais n'a pas dit au projet d'inclure cette bibliothèque spécifique. Sous Linker >> Général >> Bibliothèques >> Ajouter un fichier de bibliothèque, puis choisissez le fichier sqlite3.lib. – Jay

11

est ici ce qui a fonctionné pour moi:

Dans Visual Studio 2010, cliquez sur "Outils, Invite VS commande"

Dans la fenêtre de ligne de commande, entrez, par exemple:

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

Dans la fenêtre de l'Explorateur de solutions, faites un clic droit sur votre projet, ajoutez le fichier "sqlite3.lib".

(on croirait que le gang de SQLite pourrait inclure une .lib dans le téléchargement?)

+0

Comment le faisons-nous dans Visual Studio 2012? Il me donne l'erreur 'Command" lib "n'est pas valide. – satur9nine

+0

Cela corrige le message" non résolu externe "pour moi, et l'application s'exécute ... et se bloque immédiatement. Impossible d'activer l'application Windows Store .... Le processus ... a démarré, mais la demande d'activation a échoué avec l'erreur "L'application n'a pas démarré". ' – McGarnagle

+0

Mon erreur - la réponse ici fonctionne pour moi aussi (ci-dessus le commentaire est dû à moi en construisant x86 pour un projet x64, comme un imbécile). – McGarnagle

Questions connexes