2010-12-31 1 views
9

J'essaie d'implémenter soci dans mon programme mais je ne sais pas comment. J'utilise C++ sur Linux, sur un projet utilisant netbeans. J'ai suivi les étapes dans: http://soci.sourceforge.net/doc/structure.html pour l'installer, et j'ai essayé de copier les fichiers soci.h de/src/core et soci-mysql.h de/src/backends/mysql dans mon projet mais cela donne une erreur de compilation (ces fichiers incluent d'autres fichiers sociaux, mais il est illogique de copier tous les fichiers dans le répertoire ...). J'ai lu le guide plusieurs fois mais je ne comprends pas ce que je fais mal. Les exemples incluent uniquement ces fichiers.Comment utiliser la bibliothèque de base de données SOCI C++?

Merci.

Modifier: J'ai donné plus d'informations dans un commentaire ci-dessous la réponse. Je ne sais pas quelles étapes je dois suivre pour mettre en œuvre le soci.

+0

Avez-vous réellement lancé 'make install'? Vous n'avez pas besoin de copier les fichiers d'en-tête dans le répertoire de votre projet. – chrisaycock

+1

J'ai exécuté cette commande.Si je ne copie pas ces fichiers, le compilateur donne une erreur en disant que les fichiers soci.h et soci-mysql.h n'ont pas été trouvés. Je copie juste les inclusions suivantes d'un exemple sur la documentation: [code] #include "soci.h" #include "soci-mysql.h" [/ code] mais cela n'a pas fonctionné, le compilateur a dit que ces fichiers didn n'existe pas, alors j'ai essayé de les copier du paquet soci. – NeDark

Répondre

6

Le bit correspondant sur cette page est

Lorsque le script de configuration est exécutée sans paramètres, la partie restante du processus utilisera /usr/local/include/soci comme destination par défaut pour les fichiers d'en-tête SOCI et /usr/local/lib comme destination par défaut fichiers bibliothèque

maintenant/usr/local/include doit être dans votre chemin par défaut comprennent (par exemple, essayer quelque chose comme gcc -c -v -x c++ /dev/null -o /dev/null pour voir la liste de votre installation utilise) et vous pouvez donc les inclure à l'aide

#include <soci/soci.h> 
#include <soci/soci-mysql.h> 

Vous devez ensuite ajouter les bibliothèques à votre étape de liaison. Il semble que vous ayez des versions statiques et partagées des bibliothèques. Vous devrez ajouter -lsoci_core -lsoci_mysql à votre étape de lien; Toutefois, si cela ne fonctionne pas, vous devrez également spécifier/usr/local/lib en tant que répertoire de recherche, c'est-à-dire -L/usr/local/lib -lsoci_core -lsoci_mysql. (Encore une fois il est probablement déjà là mais vous pouvez voir en utilisant gcc -print-search-dirs.) Cependant, le problème est que si vous utilisez la version partagée et/usr/local/lib n'est pas dans votre chemin de recherche de la bibliothèque de distributions (voir/etc/ld.so.conf et/ou /etc/ld.so.conf.d/*), il ne pourra pas trouver la bibliothèque partagée lors de l'exécution. Vous devrez soit coder en dur dans le chemin d'accès à la bibliothèque avec le commutateur de liens -rpath ou ajouter/usr/local/lib au chemin de recherche à l'échelle du système comme avant ou dans votre environnement (variable LD_LIBRARY_PATH). Je ne suis pas sûr de ce que la meilleure façon de faire est - je suggère -rpath pour éviter de modifier le système en général, bien que si vous construisez beaucoup de bibliothèques dans/usr/local/lib, il serait logique d'ajouter il.

+0

La bibliothèque lève l'exception "Impossible de trouver la bibliothèque partagée pour mysql backend" même en spécifiant/usr/local/lib comme un répertoire de recherche et -rpath, mais je peux le résoudre en copiant les trois fichiers .so du backend mysql dans le répertoire du projet. Merci! – NeDark

+0

Hmm, j'ai peut-être tort alors: il est possible que vous ayez seulement besoin de lier dans '-lsoci_core' et ensuite il va ouvrir la bibliothèque mysql elle-même? Il est étrange qu'elle ne puisse pas trouver la bibliothèque, car elle aurait su que/usr/local/lib serait l'endroit où regarder le temps de construction. Désolé, je ne connais pas spécifiquement la société pour suggérer quelque chose de mieux mais je suis content que vous l'ayez fait fonctionner! – Rup

+0

Non, je viens d'essayer ça et ça ne marche pas sans l'option -lsoci_mysql. Je ne sais pas pourquoi mais soci essaie aussi d'ouvrir la librairie back-up mysql. J'ai trouvé le fichier où cela se produit en cherchant l'erreur sur Google: http://code.google.com/p/boost-soci/source/browse/trunk/libs/soci/src/backend-loader.cpp?r= 2 PD: Pouvez-vous me dire comment vous mettez des "tags de code" sur les commentaires? – NeDark

2

j'ai eu le même ne se charge pas backend erreur sur mon programme C++ quand j'exécute session sql("mysql://db=...)

J'ai trouvé une solution (au moins sur mon Ubuntu 11.04). Il suffit de faire:

sudo -i ln -s /usr/lib/libsoci_mysql-gcc-3_0-3.0.0.so /usr/lib/libsoci_mysql.so 

Il semble que la recherche de la bibliothèque SOCI pour le fichier /usr/lib/libsoci_mysql.so qui ne sont pas dans le système, vous pouvez acheter si vous faites un lien vers la bibliothèque /usr/lib/libsoci_mysql-gcc-3_0-3.0.0.so que ce soit dans le système, il fonctionne (je pense que debian/Ubuntu fait un changement de nom de fichier du nom d'origine, mais il a des effets secondaires parce que la bibliothèque SOCI recherche à l'intérieur pour le nom d'origine).

J'ai trouvé l'erreur en utilisant la variable d'environnement bash LD_DEBUG=files et en exécutant mon binaire C++.

Espérons que ça aide.

+0

'export LD_DEBUG = files' était très utile, merci. –

Questions connexes