Oppure

Loading
30/09/15 15:38
cosimo patrucci
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

void inizializza();


myLib.c

#include <my_global.h>
#include <mysql.h>
#include <stdio.h>

void inizializza()
{
	printf("function _init\n");
	MYSQL *con=mysql_init(NULL); // funzioni che appartengono a mysql
	if(con==NULL){printf("err\n");}
	else{printf("mySQL OK!!\n");}
}


per compilare uso i seguenti comandi da Terminal:

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


da cui ricavo il file myLib.o, quindi:

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 30/09/15 15:41
aaa
30/09/15 18:34
Roby94
Cosa ti aspettavi come output?
aaa
30/09/15 19:04
cosimo patrucci
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

#include "myLib.h"
#include <stdio.h>

int main()
{
	inizializza();
}


Dal Terminal:

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 30/09/15 19:08
aaa
30/09/15 19:46
pierotofy
gcc -o test test.c -L/home/cosimo/Desktop/mysql_test -lmyLib -L/usr/local/mysql/lib -lmysqlclient -lz


dev.mysql.com/doc/refman/5.0/en/…
Il mio blog: piero.dev
30/09/15 20:56
cosimo patrucci
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

aaa
01/10/15 0:00
pierotofy
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:

ar -x libmysqlclient.a


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

ar -c libbadidea.a *.o


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. stackoverflow.com/questions/6264249/…
Ultima modifica effettuata da pierotofy 01/10/15 0:02
Il mio blog: piero.dev
01/10/15 10:37
Roby94
In piu dovresti riscrivere l'header file per dare un senso a quello che vuoi fare.
aaa
01/10/15 13:57
cosimo patrucci
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
aaa