Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Compilare libreria statica linkando una libreria mysql
Forum - C/C++ - Compilare libreria statica linkando una libreria mysql

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
cosimo patrucci (Normal User)
Newbie


Messaggi: 6
Iscritto: 30/09/2015

Segnala al moderatore
Postato alle 17:38
Mercoledì, 30/09/2015
Salve a tutti. Ho cercato nelle precedenti discussioni ma non ho trovato quello che mi riguarda.
Sto provando a creare una piccola libreria (statica) personale in C (o anche C++) che fa uso delle funzioni e delle librerie di mySQL, ma non so compilarla.
Sto lavorando con gcc/g++ su Ubuntu.

myLib.h

Codice sorgente - presumibilmente C/C++

  1. void inizializza();



myLib.c

Codice sorgente - presumibilmente C++

  1. #include <my_global.h>
  2. #include <mysql.h>
  3. #include <stdio.h>
  4.  
  5. void inizializza()
  6. {
  7.         printf("function _init\n");
  8.         MYSQL *con=mysql_init(NULL); // funzioni che appartengono a mysql
  9.         if(con==NULL){printf("err\n");}
  10.         else{printf("mySQL OK!!\n");}
  11. }



per compilare uso i seguenti comandi da Terminal:

Codice sorgente - presumibilmente Plain Text

  1. gcc -I/usr/include/mysql -c myLib.c



da cui ricavo il file myLib.o, quindi:

Codice sorgente - presumibilmente Plain Text

  1. ar rcs libmyLib.a myLib.o ... ??



come si compila ? come linko le librerie mysql per realizzare la mia libreria statica ?
potete farmi vedere come fare ?
Grazie in anticipo.

Ultima modifica effettuata da cosimo patrucci il 30/09/2015 alle 17:41
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 20:34
Mercoledì, 30/09/2015
Cosa ti aspettavi come output?

PM Quote
Avatar
cosimo patrucci (Normal User)
Newbie


Messaggi: 6
Iscritto: 30/09/2015

Segnala al moderatore
Postato alle 21:04
Mercoledì, 30/09/2015
Ciao Roby. Quando si fa tutto come si deve e la compilazione riesce non viene visualizzato alcun output.
Talvolta anche quando non si fa tutto come si deve e sembra che la compilazione sia riuscita non viene visualizzato alcun output.
Sta di fatto poi che quando si tenta di utilizzare la libreria in un eseguibile, questo non funziona
Esempio:

test.c

Codice sorgente - presumibilmente C/C++

  1. #include "myLib.h"
  2. #include <stdio.h>
  3.  
  4. int main()
  5. {
  6.         inizializza();
  7. }



Dal Terminal:

Codice sorgente - presumibilmente Plain Text

  1. gcc -o test test.c -L/home/cosimo/Desktop/mysql_test -lmyLib



in tal caso ricevo il seguente output:

In function `inizializza': myLib.c: (.text+0x1a): undefined reference to `mysql_init'
collect2: error: ld returned 1 exit status

Probabilmente la libreria risulta compilata, ma le funzioni mysql contenute non vengono riconosciute.


Ultima modifica effettuata da cosimo patrucci il 30/09/2015 alle 21:08
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 21:46
Mercoledì, 30/09/2015
Testo quotato


gcc -o test test.c -L/home/cosimo/Desktop/mysql_test -lmyLib -L/usr/local/mysql/lib -lmysqlclient -lz



Il mio blog: https://piero.dev
PM Quote
Avatar
cosimo patrucci (Normal User)
Newbie


Messaggi: 6
Iscritto: 30/09/2015

Segnala al moderatore
Postato alle 22:56
Mercoledì, 30/09/2015
Ciao Piero. Grazie per la tempestiva risposta. Ma forse non ho ben compreso i meccanismi di compilazione.
Io cerco di realizzare una libreria che contenga anche i link alle librerie utilizzate.
Lo scopo della libreria di alto livello 'myLib' dev'essere proprio quello di far sì che chi la utilizza non deve preoccuparsi di linkare tutte le librerie che di myLib fanno parte. Non so se mi sono espresso correttamente.
Il link che mi hai mandato lo conoscevo già, e la parte di stringa scritta da te si può anche sintetizzare con $(mysql_config --libs).
Grazie


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 2:00
Giovedì, 01/10/2015
Precisando prima di tutto che quello che stai cercando di fare non ha molto senso dal lato pratico; perchè creare una libreria che comprende altre librerie, quando lo scopo di separare il codice in più librerie è quello di agevolare modularizzazione? Convenienza di portabilità non è una scusa, siccome non ci vuole nulla ad aggiungere una libreria in più oppure specificare un parametro in più durante la compilazione (per questo si usano i makefiles!).

Ma se proprio si vuole fare...

Prima di aggregare MySQL devi estrarre i suoi object files:

Testo quotato


ar -x libmysqlclient.a



Dopodichè puoi creare una nuova libreria, che include tutti i files .o di MySQL più quello tuo (mylib.o):

Testo quotato


ar -c libbadidea.a  *.o



Testo quotato


gcc -o test test.c -L/home/cosimo/Desktop/mysql_test -lbadidea



Non raccomanderei questo approccio e se fossi lo sviluppatore che deve usare la tua libreria, questo approccio mi farebbe infuriare.

Assicurati inoltre di studiare bene come funziona il processo di compilazione, linking, etc. http://stackoverflow.com/questions/6264249/how-does-the-co ...

Ultima modifica effettuata da pierotofy il 01/10/2015 alle 2:02


Il mio blog: https://piero.dev
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 12:37
Giovedì, 01/10/2015
In piu dovresti riscrivere l'header file per dare un senso a quello che vuoi fare.

PM Quote
Avatar
cosimo patrucci (Normal User)
Newbie


Messaggi: 6
Iscritto: 30/09/2015

Segnala al moderatore
Postato alle 15:57
Giovedì, 01/10/2015
Salve. Grazie per le risposte. Ma mi sembra di capire che il meccanismo di funzionamento delle librerie differisce un po' fra Windows e Linux. Con Windows (Visual C++) non trovo alcuna difficoltà a fare ciò che ho chiesto.

Se realizzo una libreria per mySQL di alto livello lo faccio per mettere a disposizione dell'utilizzatore (me stesso) un sistema di funzioni ed istruzioni capaci di realizzare in modo semplice ed automatico cose che a basso livello è più difficile realizzare. Mi sembrava logico e pratico linkare personalmente la libreria che lo sviluppatore (me stesso) si troverà inevitabilmente ad usare. Tutto qui.
Non fa niente, userò un altro approccio come detto da Piero.
Grazie

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 18:49
Giovedì, 01/10/2015
Creare un interfaccia di alto livello differisce da quello che hai chiesto te nei messaggi precedenti. Su Linux e Windows funziona nello stesso modo, solo che su Windows ti affidi a Visual studio che fa per te dei passaggi che su Linux con un classico make non puoi trascurare.
Per questo Piero ti ha consigliato l'impiego di un makefile, applicabile sia su windows che su Linux e alcune versioni di Visual studio lo accettano direttamente come input e si affidano ad essi per il linking e la compilazione.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo