OVH Cloud OVH Cloud

C++ et librairie sqlite3

14 réponses
Avatar
Delf
Bonjour à tous.

Je commence un projet en C++ qui va utiliser sqlite 3.3.5. Je me fais
donc un p'tit programme pour me faire la main avant de commencer.

J'ai récupéré les sources, je les ai compilés mais je n'ai pas installé
sqlite sur mon système. Je ne veux pas installer sqlite, juste pouvoir
utiliser la librairie. Première question, possible ?

Arborescence:

project/
|--libs/
|--src/

J'ai mis libsqlite3.so.8 et sqlite3.h dans libs. Une de mes classes
(dans src) utilise sqlite3.h

#include "../libs/sqlite3.h"

Quand je compile, j'obtiens les messages suivants :

[18:11][delf@freaker src]# make
g++ -c SqliteWrapper.cpp
g++ -o program.out main.o SqliteWrapper.o
SqliteWrapper.o(.text+0x165): In function
`sercker::wrappers::CSqliteWrapper::Function() const':
: undefined reference to `sqlite3_open'
*** Error code 1

Stop in /usr/home/delf/sercker/src.

Mon Makefile de warrior est tout bête :

[18:06][delf@freaker src]# cat Makefile
program.out: main.o SqliteWrapper.o
g++ -o program.out main.o SqliteWrapper.o
main.o: main.cpp SqliteWrapper.h
g++ -c main.cpp
SqliteWrapper.o: SqliteWrapper.cpp SqliteWrapper.h
g++ -c SqliteWrapper.cpp

Je ne comprends pas le message : undefined reference to `sqlite3_open'

Si quelqu'un pouvait m'aider...
Merci anticipé.

--
Delf
Do not use this email in Cc!
L'alcool tue lentement. On s'en fout. On n'est pas pressé.

10 réponses

1 2
Avatar
Rémi Moyen
Delf wrote:

Je ne comprends pas le message : undefined reference to `sqlite3_open'



C'est parce que, comme tu le dis toi-même, tu ne lui indiques pas
d'utiliser la bibliothèque qui contient cette fonction dans ta ligne
d'édition de liens.

Comment préciser au compilateur d'utiliser la libsqlite3 qui se situe
dans le répertoire libs/


g++ -L/path/to/directory/libs -lsqlite3 -o program.out main.o
SqliteWrapper.o

(si la bibliothèque s'appelle libsqlite3.so et est rangée dans
/path/to/directory/libs)

Sinon, man gcc, tout ça...
--
Rémi Moyen


Avatar
Delf
Delf wrote:

Je ne comprends pas le message : undefined reference to `sqlite3_open'


Comment préciser au compilateur d'utiliser la libsqlite3 qui se situe
dans le répertoire libs/

--
Delf
Do not use this email in Cc!
L'homme n'est que poussière. La femme est aspirateur.

Avatar
Rémi Moyen
Rémi Moyen wrote:

g++ -L/path/to/directory/libs -lsqlite3 -o program.out main.o
SqliteWrapper.o



J'ai retouvhé mon Makefile :

program.out: main.o SqliteWrapper.o
g++ -I../include -L../libs -lsqlite3 -o program.out main.o


Des chemins relatifs ne me semblent pas le plus solide, comme manière de
faire. Mais bon, ça ne devrait pas poser de problème, pour autant que je
sache.

include/ contient sqlite3.h
libs/ contient libsqlite3.so.8 & libsqlite3.a (je ne sais pas s'il faut
les 2...)


Il me semble que -ltoto va chercher libtoto.so ou libtoto.a (mais j'ai
la flemme de lire le man pour vérifier), donc ça devrait être bon
(puisqu'il y a le .a).

Ceci dit, essaye de rajouter un lien libsqlite3.so -> libsqlite3.so.8
(comme ça, il trouvera le .so).
--
Rémi Moyen


Avatar
Delf
Rémi Moyen wrote:

g++ -L/path/to/directory/libs -lsqlite3 -o program.out main.o
SqliteWrapper.o


J'ai retouvhé mon Makefile :

program.out: main.o SqliteWrapper.o
g++ -I../include -L../libs -lsqlite3 -o program.out main.o SqliteWrapper.o
main.o: main.cpp SqliteWrapper.h
g++ -c main.cpp
SqliteWrapper.o: SqliteWrapper.cpp SqliteWrapper.h
g++ -I../include -L../libs -lsqlite3 -c SqliteWrapper.cpp

include/ contient sqlite3.h
libs/ contient libsqlite3.so.8 & libsqlite3.a (je ne sais pas s'il faut
les 2...)

g++ -c main.cpp
g++ -I../include -L../libs -lsqlite3 -c SqliteWrapper.cpp
g++: -lsqlite3: linker input file unused because linking not done
g++ -I../include -L../libs -lsqlite3 -o program.out main.o SqliteWrapper.o
SqliteWrapper.o(.text+0x165): In function
`sercker::wrappers::CSqliteWrapper::Function() const':
: undefined reference to `sqlite3_open'
*** Error code 1

Stop in /usr/home/delf/sercker/src.

Je dois louper quelque chose, c'est pas possible.

--
Delf
Do not use this email in Cc!
Quand je vais aux chiottes, je prends un manuel CISCO.

Avatar
Erwann ABALEA
This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.

---559023410-684387517-1144649872=:11051
Content-Type: TEXT/PLAIN; charset=iso-8859-15; format=flowed
Content-Transfer-Encoding: 8BIT

On Sun, 9 Apr 2006, Delf wrote:

Rémi Moyen wrote:

g++ -L/path/to/directory/libs -lsqlite3 -o program.out main.o
SqliteWrapper.o



Le -lsqlite3 doit se trouver *après* les modules qui en ont besoin.
Ici, le déplacer, pour le mettre tout à la fin.

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
fgu> Je reviens sur mon post de 11h27 : Au lieu de :"2ème DD en
fgu> Secondary Master (SM)" ce serait plutôt : "2ème DD en Primary Slave
fgu> (PS)"
-+-Guide du Neuneu d'Usenet-La dialectique du maître et de l'esclave -+-
---559023410-684387517-1144649872=:11051--


Avatar
Rémi Moyen

g++ -L/path/to/directory/libs -lsqlite3 -o program.out main.o
SqliteWrapper.o




Le -lsqlite3 doit se trouver *après* les modules qui en ont besoin.
Ici, le déplacer, pour le mettre tout à la fin.


Tu m'as fait douter, alors j'ai testé :-)

Chez moi (Debian/testing, g++ 4.0.3), la position du -ltoto ne change
strictement rien. La ligne de compilation telle qu'indiquée fonctionne
(enfin, j'ai pas essayé avec libsqlite3 que je connais pas, mais avec
une autre lib et c'est pareil).
--
Rémi Moyen



Avatar
Rémi Moyen

J'ai testé aussi, apparemment ça ne change rien, j'ai toujours cette
erreur.


As-tu essayé le lien symbolique libsqlite3.so -> libsqlite3.so.8 ?
--
Rémi Moyen

Avatar
Delf
Rémi Moyen wrote:

Chez moi (Debian/testing, g++ 4.0.3), la position du -ltoto ne change
strictement rien. La ligne de compilation telle qu'indiquée fonctionne
(enfin, j'ai pas essayé avec libsqlite3 que je connais pas, mais avec
une autre lib et c'est pareil).


J'ai testé aussi, apparemment ça ne change rien, j'ai toujours cette erreur.

--
Delf
Do not use this email in Cc!

Avatar
Delf

As-tu essayé le lien symbolique libsqlite3.so -> libsqlite3.so.8 ?


Oops : A tester ce soir. Sinon, je peux renommer le .so non ?

--
Delf

Avatar
Delf

[...]


Je commence à me poser des questions là...

Je refais un récapitulatif de la situation actuelle (je vais péter un
plomb) :

L'arborescence du projet

projet
|-- include/
|-- libs/
|-- src/

1. j'ai compilé sqlite-3.3.5 (non installé sur le système)
2. j'ai récupéré:
- le libsqlite3.so.8 -> mis dans libs/
- le libsqlite3.a -> mis dans libs/
- le sqlite3.h -> mis dans include/
3. le fichier SqliteWrapper.cpp contient
- #include "../include/sqlite3.h"

4. le Makefile :

program.out: main.o SqliteWrapper.o
g++ -o program.out main.o SqliteWrapper.o
main.o: main.cpp SqliteWrapper.h
g++ -c main.cpp
SqliteWrapper.o: SqliteWrapper.cpp SqliteWrapper.h
g++ -I../include -L../libs -c SqliteWrapper.cpp -lsqlite3

5. je lance la compilation :

[12:22][ src]# make
g++ -c main.cpp
g++ -I../include -L../libs -c SqliteWrapper.cpp -lsqlite3
g++: -lsqlite3: linker input file unused because linking not done
g++ -o program.out main.o SqliteWrapper.o
SqliteWrapper.o(.text+0x165): In function
`sercker::wrappers::CSqliteWrapper::Function() const':
: undefined reference to `sqlite3_open'
*** Error code 1

Stop in /usr/home/delf/sercker/src.

Je ne sais plus quoi faire... tout me semble bon portant.
Y a-t-il un outil pour visualiser les fonctions d'une lib ?

Merci anticipé.

--
Delf

1 2