cosimo patrucci (Normal User)
Newbie
Messaggi: 6
Iscritto: 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++ |
myLib.c
Codice sorgente - presumibilmente 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:
Codice sorgente - presumibilmente Plain Text |
gcc -I/usr/include/mysql -c myLib.c
|
da cui ricavo il file myLib.o, quindi:
Codice sorgente - presumibilmente Plain Text |
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 |
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
Cosa ti aspettavi come output?
|
|
cosimo patrucci (Normal User)
Newbie
Messaggi: 6
Iscritto: 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++ |
#include "myLib.h"
#include <stdio.h>
int main()
{
inizializza();
}
|
Dal Terminal:
Codice sorgente - presumibilmente Plain Text |
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 |
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
gcc -o test test.c -L/home/cosimo/Desktop/mysql_test -lmyLib -L/usr/local/mysql/lib -lmysqlclient -lz
|
|
|
cosimo patrucci (Normal User)
Newbie
Messaggi: 6
Iscritto: 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
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
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:
Dopodichè puoi creare una nuova libreria, che include tutti i files .o di MySQL più quello tuo (mylib.o):
gcc -o test test.c -L/home/cosimo/Desktop/mysql_test -lbadidea
|
Ultima modifica effettuata da pierotofy il 01/10/2015 alle 2:02
|
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
In piu dovresti riscrivere l'header file per dare un senso a quello che vuoi fare.
|
|
cosimo patrucci (Normal User)
Newbie
Messaggi: 6
Iscritto: 30/09/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
|
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
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.
|
|