2010-12-31 8 views
9

Sto cercando di implementare soci nel mio programma ma non so come. Sto usando C++ su Linux, su un progetto che usa netbeans. Ho seguito i passaggi in: http://soci.sourceforge.net/doc/structure.html per installarlo, e ho provato a copiare i file soci.h da/src/core e soci-mysql.h da/src/backends/mysql nel mio progetto ma dà un errore di compilazione (questi file includono altri file soci, ma è illogico copiare tutti i file nella directory ...). Ho letto la guida diverse volte ma non capisco cosa sto facendo male. Gli esempi includono solo questi file.Come utilizzare la libreria del database SOCI C++?

Grazie.

Modifica: ho dato più informazioni in un commento sotto la risposta. Non so quali passi devo seguire per implementare i soci.

+0

Avete effettivamente eseguito 'make install'? Non è necessario copiare i file di intestazione nella directory del progetto. – chrisaycock

+1

Ho eseguito quel comando.Se non copio quei file il compilatore dà un errore dicendo che i file soci.h e soci-mysql.h non sono stati trovati. Ho appena copiato quanto segue da un esempio sulla documentazione: [codice] #include "soci.h" #include "soci-mysql.h" [/ code] ma non ha funzionato, il compilatore ha detto che quei file non Esistono, quindi ho provato a copiarli dal pacchetto soci. – NeDark

risposta

6

Il bit rilevante in quella pagina è

Quando lo script di configurazione viene eseguito senza parametri, la parte restante del processo userà /usr/local/include/soci come destinazione predefinita per i file di intestazione soci e /usr/local/lib come destinazione predefinita per file di libreria

Ora/usr/local/include dovrebbe essere nella vostra predefinito percorso di inclusione (ad esempio, provare qualcosa di simile gcc -c -v -x c++ /dev/null -o /dev/null per vedere la lista la tua installazione usi) e in modo da poter includere questi usando

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

Quindi è necessario aggiungere le librerie al passaggio del collegamento. Sembra che avrete entrambe le versioni statiche e condivise delle librerie. Dovrai aggiungere -lsoci_core -lsoci_mysql al tuo passaggio di collegamento; tuttavia, se ciò non dovesse funzionare, sarà necessario specificare/usr/local/lib come directory di ricerca, ovvero -L/usr/local/lib -lsoci_core -lsoci_mysql. (È probabile che sia già presente, ma è possibile vedere utilizzando gcc -print-search-dirs.) Tuttavia, il problema è che se si sta utilizzando la versione condivisa e/usr/local/lib non si trova nel percorso di ricerca della libreria delle distribuzioni (vedere/etc/ld.so.conf e/o /etc/ld.so.conf.d/*) quindi non sarà in grado di trovare la libreria condivisa in fase di runtime. Avrai bisogno di un hard-code nel percorso della libreria con l'interruttore linker -rpath o aggiungi/usr/local/lib al percorso di ricerca a livello di sistema come prima o nel tuo ambiente (variabile LD_LIBRARY_PATH). Non sono sicuro di quale sia il modo migliore per farlo - Suggerirei -rpath per evitare di modificare il sistema in generale, anche se se stai costruendo molte librerie in/usr/local/lib, potrebbe essere logico aggiungere esso.

+0

La libreria genera l'eccezione "Impossibile trovare la libreria condivisa per il backend mysql", anche specificando/usr/local/lib come directory di ricerca e -rpath, ma potrei risolverlo copiando i tre file .soq del backend nella directory del progetto. Grazie! – NeDark

+0

Hmm, potrei avere sbagliato allora: è possibile che tu abbia solo bisogno di link in '-lsoci_core' e poi dlopen la libreria mysql stessa? È strano che non possa trovare la libreria, tuttavia, poiché avrebbe saputo che/usr/local/lib sarebbe stato il posto dove guardare il tempo di costruzione. Scusate, non conosco i soci in particolare per suggerire qualcosa di meglio ma contento che tu abbia funzionato! – Rup

+0

No, l'ho appena provato e non funziona senza l'opzione -lsoci_mysql. Non so perché, ma i soci tentano anche di dlopen la libreria backend mysql. Ho trovato il file in cui ciò accade cercando l'errore di previus su google: http://code.google.com/p/boost-soci/source/browse/trunk/libs/soci/src/backend-loader.cpp?r= 2 PD: puoi dirmi come hai inserito i "tag di codice" nei commenti? – NeDark

2

ho ottenuto lo stesso non caricare backend errore sul mio programma in C++, quando eseguo session sql("mysql://db=...)

ho trovato una soluzione (almeno sul mio Ubuntu 11.04). Basta fare:

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

E sembra che la ricerca della libreria soci per il file /usr/lib/libsoci_mysql.so che non è nel sistema, acquistare se si effettua un collegamento alla libreria /usr/lib/libsoci_mysql-gcc-3_0-3.0.0.so che è nel sistema che funziona (credo debian/ubuntu cambia il nome del file dal nome originale, ma ha effetti collaterali perché la libreria SOCI cerca all'interno il nome originale).

Ho trovato l'errore utilizzando la variabile di ambiente bash LD_DEBUG=files ed eseguendo il mio binario C++.

Spero che aiuti.

+0

'export LD_DEBUG = files' è stato molto utile, grazie. –

Problemi correlati