Newsgroup: it.comp.lang.c
Titolo: header file e librerie

Che differenza c''e fra un header file e una libreria ?
Augusto Pucci
Webmaster di Prospektiva On-line
http://www.prospektiva.it

Augusto Pucci wrote:

  L'header file contiene i prototipi delle funzioni  le definizioni di
dati costanti,macro e tipi di dati definiti dall'utente.
Le librerie contengono il codice macchina delle funzioni
Ivan Molella

 Che differenza c''e fra un header file e una libreria ?
Nell'header file ci sono le dichiarazioni mentre nella libreria le
definizioni (compilate) delle funzioni.
EMG



Ecco, ma allora i prototipi negli header sono in pratica tutti extern
?
E, un altra cosa... di integarre col codice oggetto rilocabile  le
funzioni delle librerie se ne occupa il linker ?
E, ultima cosa...e' "ortodosso" fare cose del tipo :
------ file test.c ----
#include  <funzioni.h>
bla bla bla
-----------------------
------ file funzioni.h ------
void pippo(void) 
void pippo(void)
{
bla bla bla
}
PS : bla bla bla sara' ANSI come funzione ? :-)


 PS : bla bla bla sara' ANSI come funzione ? :-)
Cosa intendi dire?
EMG

Cosa intendi dire?
No questa era una battuta riferendomi al fatto che per tagliare il
testo ho scritto bla bla bla...


 testo ho scritto bla bla bla...
Ah, scusa, non l'avevo capita. :-)
EMG

nell'eseguibile.
Quindi ad esempio poyrei strutturare una cosa del tipo :
--- file PRINCIPALE.C ------
#include <funzioni.h>
bla bla bla 
-------------------------------
----- file FUNZIONI.H-------
void parser(void);
-----------------------------
----- file FUNZIONI.C -------
void parser(void)
{
bla bla bla
}
-------------------------
Ma come fa il linker a sapere dove sono le definizioni delle funzioni
dichiarate nell'header ?


 dichiarate nell'header ?
Semplicemente devi specificare tutti i sorgenti nella linea di comando o
aggiungerli al progetto (a seconda di quale compilatore usi).
EMG

 
http://www.prospektiva.it
Il linker trovera' le varie funzioni che definisci nei  vari file obj che
linkerai assieme
Allora facciamo un esempio.
Tu hai un tuo progetto il cui file sorgente principale e' main_progect.c,che e'
quello in cui si trova ovviamente la funzione principale: int main( int argc,char
*argv[] ).
Ora facciamo il caso che tu voglia dividere funzionalmente le funzioni che
richiami in main_progect.c per esempio raggruppando tutte quelle relative alla
gestione del file-system in fs_progect.c e quelle relative alle socket in
sock_progect.c.
Come sara' strutturato il tuo progetto?
Cosi:
/*
     FILE FS_PROGECT.H
*/
#ifndef    _FS_PROGECT_H
#define   _FS_PROGECT_H
#define..........
typedef..........
int    prima_fs__func(.......);
int    seconda_fs__func(.......);
.......
#endif
/*
     FILE FS_PROGECT.C
*/
#include<stdio.h>
#include<string.h>
........
........
#include "fs_progect.h"
int    prima_fs__func(.......)
{
.......
........
}
int    seconda_fs__func(.......)
{
.......
........
}
/*
     FILE SOCK_PROGECT.H
*/
#ifndef    _SOCK_PROGECT_H
#define   _SOCK_PROGECT_H
#define..........
typedef..........
int    prima_sock__func(.......);
int    seconda_sock__func(.......);
.......
#endif
/*
     FILE SOCK_PROGECT.C
*/
#include<stdio.h>
#include<string.h>
........
........
#include "sock_progect.h"
int    prima_sock__func(.......)
{
.......
........
}
int    seconda_sock__func(.......)
{
.......
........
}
/*
     FILE MAIN_PROGECT.C
*/
#include<stdio.h>
#include<string.h>
#include "fs_progect.h"
#include "sock_progect.h"
int main( int argc,char *argv[] )
{
     prima_sock__func(.......)
     seconda_sock__func(.......)
.......
......
     prima_fs__func(.......)
     seconda_fs__func(.......)
......
......
     return 0;
}
Cosi' puoi compilare separatamente i vari file del progetto:
ES:
gcc -c main_progect.c -o main_progect.o      (crei il file obj relativo al file
main_progect.c del progetto)
gcc -c fs_progect.c -o fs_progect.o               (crei il file obj relativo al
file fs_progect.c  del progetto)
gcc -c sock_progect.c -o sock_progect.o      (crei il file obj relativo al file
sock_progect.cdel progetto)
poi li linkerai tutti insieme e creerai il file eseguibile:
ld -o my_progect main_progect.o fs_progect.o sock_progect.o
Non sono sicuro sulle  opzioni di compilazione e link che ho dato qui sopra sono
andato a memoria comunque il concetto e' questo.
Ivan Molella

andato a memoria comunque il concetto e' questo.
Grazie epr l'esempio, ora comincio ad averci le idee + chiare.
