Problèmes de liaison à sqlite3.h avec gcc
Je travaille sur Linux Mint 15. J'ai téléchargé sqlite-amalgamation-3080002.zip
de http://www.sqlite.org/download.html (et mettre les fichiers dans mon répertoire de projet)
J'ai fait (même si je sais que c'est redondant à l'étape précédente):
sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev
sqlite3
fonctionne en ligne de commande est très bien et je peux créer/modifier des bases de données.
J'ai créé un fichier de test:
#include <stdio.h>
#include <sqlite3.h>
int main(int argc, char* argv[]){
sqlite3 *db;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("test.db", &db);
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
exit(0);
}else{
fprintf(stderr, "Opened database successfully\n");
}
sqlite3_close(db);
}
et a couru:
gcc ./sqliteTest.c -o sqliteTest -lsqlite
et a obtenu l'erreur suivante:
./sqliteTest.c: In function ‘main’:
./sqliteTest.c:14:7: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
/usr/bin/ld: cannot find -lsqlite
collect2: error: ld returned 1 exit status
J'ai essayé:
gcc -Wall sqliteTest.c -o sqliteTest -lsqlite
et a obtenu:
sqliteTest.c: In function ‘main’:
sqliteTest.c:14:7: warning: implicit declaration of function ‘exit’ [-Wimplicit-function-declaration]
sqliteTest.c:14:7: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
sqliteTest.c:7:10: warning: unused variable ‘zErrMsg’ [-Wunused-variable]
sqliteTest.c:19:1: warning: control reaches end of non-void function [-Wreturn-type]
/usr/bin/ld: cannot find -lsqlite
collect2: error: ld returned 1 exit status
J'ai changé le <sqlite3.h>
à "sqlite3.h"
et fait la première commande compile et a obtenu:
./sqliteTest.c: In function ‘main’:
./sqliteTest.c:14:7: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
/tmp/ccvdOOv2.o: In function `main':
sqliteTest.c:(.text+0x24): undefined reference to `sqlite3_open'
sqliteTest.c:(.text+0x39): undefined reference to `sqlite3_errmsg'
sqliteTest.c:(.text+0x89): undefined reference to `sqlite3_close'
collect2: error: ld returned 1 exit status
Je suis perplexe... Que dois-je essayer?
Vous devez vous connecter pour publier un commentaire.
SQLite est une source seule bibliothèque. Vous intégrez la source dans l'application, pas de liaison avec elle. Si la référence non définie vient du fait que vous ne parvenez pas à inclure le fichier source de sqlite. Essayez de compiler comme
sqlite3.h
dans /usr/include, et metlibqslite3.so
dans un répertoire où GCC trouverez. Depuis l'interlocuteur ne#include <sqlite3.h>
dans son code, pas#include "sqlite3.h"
, il essaie d'utiliser la version du système, et le fait qu'il ont également téléchargé le code source est un ignorable de red herring. Sinon, il doit le faire de la manière que vous le recommander, mais alors il devrait également#include "sqlite3.h"
au lieu de#include <sqlite3.h>
.#include "sqlite3.h"
dans la dernière partie de sa question. Mais il est intéressant de savoir que la Menthe donne une version compilée."sqlite.h"
, il devrait être l'ajout de sqlite3.c pour sa compilation, et non de relier avec-lsqlite3
, juste comme vous l'avez dit. Aussi, je pense que quasiment tous les Linux fournit précompilation de cette bibliothèque (et des tonnes d'autres). En fait, les principales distributions préfèrent fournir leurs propres versions de tout, même si le fabricant du produit fournit des versions, parce que de cette façon ils peuvent personnaliser pour s'aligner avec leur système d'exploitation mise en page et de la philosophie. (Et de leurs propres corrections de bugs et des choses comme ça...)sqlite-amalgamation-3080002.zip
que cela donne généralement une meilleure performance. Qui n'a pas fonctionné et la compilation avec une faute de frappe (sqlite
vssqlite3
) n'a pas fonctionné et sqlite3 à l'invite de commande n'a pas fonctionné donc j'ai supposé que la Menthe ne fait PAS venir avec sqlite. Donc j'ai fait apt-get.Bien, d'abord, vous devez
#include <stdlib.h>
de disposer d'une déclaration deexit()
dans le champ, et le deuxième vous devriez vous rappeler que ce que vous essayez de lien avec est nommé "sqlite3", et de remplacer le-lsqlite
dans votre ligne de lien avec-lsqlite3
.#include "sqlite3.h"
?3
était une évidente erreur stupide. <stdlib.h> est utile aussi bien.Cela fonctionne
CodeLite:
clic droit sur le projet>paramètres>linker:
1. Les bibliothèques de Recherche de Chemin d'accès : /usr/include (chemin où sqlite3.h);
2. Bibliothèques : sqlite3
3. appuyez sur OK
et F7 pour projet de reconstruction de