Newsgroup: it.comp.lang.c
Titolo: costruire librerie

faccio la mia prima esperienza di programmazione in c mettendo le mani
su un programma più grosso di me, a cui devo aggiungere delle patch.
ho bisogno di condividere una funzione di tre righe tra due file
differenti, di tipo .c, che risiedono nella stessa cartella, come se
fosse una libreria.
quali sono gli strumenti per ottenere questo risultato?

 ha scritto nel messaggio 
news:31292e5e-9cdb-4a5c...@d77g2000hsb.googlegroups.com...


Non capisco bene la questio..
Ti serve
1) un modulo di libreria riutilizzabile da includere in due progetti diversi
in questo caso, la creazione di una libreria dipende anche dal SO che usi
e dal tool specifico (con IDE senza ? gcc? VisualStudio? Borland & simili o 
altro ?
La libreria deve essere statica o dinamica ?
Una libreria statica è piu' semplice da gestire...in effetti è un oggetto 
binario
che viene linkato alla tua applicazione..una libreria dinamica è un pochino
piu' complicata da gestire e si carica a run-time...
2) una funzione pubblica richiamabile da diversi moduli dello stesso 
progetto
Qua basta scrivere un modulo c con la tua funzione e aggiugerlo al tuo
progetto: il come fare dipende da cosa usi. Se usi un IDE e' una cosa, se
usi makefile un'altra....
3) ti basta un modulo sorgente da includere in due differenti progetti
ance qui, vedi 2, solo che lo stesso sorgente lo aggiungi nei due
progetti....
In tutti i casi ti serve capire prima a) la piattaforma che devi usare b) 
quale ambiente
di sviluppo (se non c'e l' hai gia') vorresti usare ;-)
brix


puro editor di testo. la mia è una domanda a un livello più basso.
io scrivo la patch, la dò in pasto al compilatore e lui mi risponde
che  non trova la funzione, perché la ho messa nel file parallelo.
se si trattasse di una semplice variabile, me la caverei con i file
*.h, riconosciuti con il comando #include.
ho anche visto che esiste lo statement #define, che si può mettere
dentro i file *.h, ma viene utilizzato di preferenza per funzioni di
una sola riga, con controlli di base, come maggiore o diverso.
mi sembra eccessivo che arrivo io e aggiungo un define di 5 righe, con
una chiamata xml.
inoltre, ho letto che i define vengono trattati in un modo particolare
dal compilatore e questo mi fa sospettare che la cosa avrebbe delle
controindicazioni che non so prevedere.
mi servono quindi soluzioni tecniche legate al linguaggio di
programmazione, non all'ambiente di sviluppo.
la piattaforma, ovviamente, è linux (che altro?).
:)


Spero di aver capito.
1.  metti in un .h  il prototipo della funzione
2.  includi il .h  in tutti i file che contengono chiamate a quella funzione
3.  compili la funzione separatamente (se usi gcc: gcc -c funzione.c)
4.  quando compili e linki tutti gli altri file (sorgente e/o oggetto) 
ci aggiungi anche quello relativo alla funzione. Es:  gcc pippo.c a.o 
b.o funzione.o
In alternativa a 3 e 4  compili tutti i sorgenti insieme:
gcc pippo.c a.c b.c funzione.c
Giorgio
P.S.  se stai modificando un progetto gia'  fatto  e gestito via make, 
puo'  darsi che tu debba modificare il Makefile. Dovrebbe esserci una 
linea in cui viene eseguita la compilazione e il linking dei vari file. 
Operi come sopra.

   
Giorgio ti ha risposto in maniera esauriente, ma qui siamo in altomare!
Almeno UN minimo di studio del linguaggio e' doveroso!
Non ti servono soluzioni 'tecniche' ti serve leggere il manuale!!!!
....Almeno capire l' uso degli include e delle define ;-)
ciao,
brix

 :)
Se invece devi aggiungere nuove variabili o funzioni in un programma e 
se queste devono essere comuni a più sorgenti è sufficiente mettere 
questi nuovi elementi in un nuovo file da compilare e da linkare 
assieme agli altri nella generazione dell'eseguibile.  Le variabili e 
le funzioni saranno rese pubbliche e conosciute dagli file attraverso 
le opportune dichiarazioni da mettere in un header file (.h).  Se 
questi elementi dovranno essere disponibili anche al di fuori del 
programma potrà essere utile creare delle librerie ma non credo che 
questo sia il caso.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >


per la verità un libro di linguaggio C lo ho letto.
è di Brian W. Kernighan e Dennis M. Ritchie ed è edito da Jackson
Libri.
edizione '89.
il mio problema semmai, è la pratica.
perché voglio saltare a piè pari il faticoso addestramento degli
esercizi
elementari e partire ballando la samba sulla pista da ballo.
sicuramente, tutto ciò è un po' infantile, ma in fondo i bambini si
sono
sempre mostrati i più versati all'apprendimento veloce.
allora leggendo i vostri suggerimenti ho scritto una routine balorda,
in
questo modo:
gboolean dimmi_si (char *si)
{
  return TRUE;
}
la ho collocata nel file a.c, poi ho inserito questa riga in b.h:
gboolean dimmi_si (char *dummy);
e ho chiamato la funzione con un if dentro b.c :
if ((dimmi_si(*n)) ...
ho fatto la patch (so cos'è: è un ostacolo già superato, senza
postare :) )
miracolo: la funzione dentro l'if è stata eseguita (e con return
FALSE, saltata)!
ho anche osservato empiricamente che la funzione non deve essere
definita static, altrimenti si generano errori.
allora sono passato ai fatti e ... mi sono stampato di nuovo. il
file .h, questa volta contiene la seguente istruzione:
gboolean parse_item_data (xmlNodePtr node,
          GrItemInfo *info,
          GError         **error,
          char           **keyPtr,
          char           *keyName);
purtroppo non capisco l'errore in compilazione, che è il seguente:
In file included from gree.c:63:
gree_session.h:35: error: expected ‘)’ before ‘node’
make[4]: *** [greeter.o] Error 1

 make[4]: *** [greeter.o] Error 1
Probabilmente il tipo xmlNodePtr non è ancora stato definito a questo 
punto del file.
Probabilmente devi aggiungere un
#include <xmlqualcosa.h>
E.


bingo:
#include <libxml/parser.h>
stranamente, facendo un grep di xmlNodePtr sull'intero sorgente,
trovavo l'espressione in un unico file .c, senza alcuna definizione.
adesso il messaggio di errore si è trasferito alla riga successiva, ma
adesso dovrebbe essere facile uscirne.
grazie a tutti.
a risentirci alla prossima domanda nubbia.
:)

 trovavo l'espressione in un unico file .c, senza alcuna definizione.
In effetti se aggiungi quell'include nello header forse stai dando una 
dipendenza inutile a tutti i file del progetto. Se l'XML viene 
utilizzato in un unico file *.c sarebbe meglio mascherare il tipo di 
quel puntatore. Ad esempio potresti dichiararlo void *, e poi 
convertirlo quando lo utilizzi. Meglio ancora sarebbe definire tu stesso 
un tipo apposito per quel puntatore.
E.


forse esiste anche un'altra soluzione:
imparare a capire meglio il programma ed evitare del tutto gli
spostamenti.
comincio a sospettare che spostare il parsing in un file differente
non comporta vantaggi.