Ο πιο απλός τρόπος να το εξηγήσω με ζωντανό & λειτουργικό παράδειγμα, είναι το πρόγραμμα της Ξερής που έχω ανεβάσει στο σχετικό νήμα: 
viewtopic.php?f=6&t=19080Αποτελείται από 3 .c και 2 .h αρχεία:
- Κώδικας: Επιλογή όλων
 main.c
stack.c
s.c
stack.h
s.h
Ας ξεχάσουμε για λίγο τελείως τις βιβλιοθήκες. Αν ανοίξεις και δεις το αρχείο stack.h θα διαπιστώσεις πως αποτελείται από 3 λογικές ενότητες:
-  macros (#define)
 -  ορισμό της δομής Cardstack (και μάλιστα προβιβασμό της σε πρόσθετο τύπο δεδομένων, μέσω της εντολής typedef)
 -  τα πρότυπα όσων συναρτήσεων ορίζονται μέσα στο αρχείο: stack.c
 
Το αρχείο stack.c είναι ουσιαστικά το "module" του προγράμματος που ασχολείται αποκλειστικά και μόνο με τη διαχείριση στοιβών. Περιέχει δηλαδή μόνο συναρτήσεις που ασχολούνται με τη διαχείριση των στοιβών και τίποτε άλλο.
Επειδή όμως αυτές οι συναρτήσεις όπως θα δεις χρησιμοποιούν τόσο τον πρόσθετο τύπο δεδομένων Cardstack (που τον έχω ορίσει στο αρχείο: stack.h) όσο και τα macros (που επίσης έχω ορίσει στο αρχείο: stack.h) έχω συμπεριλάβει στην αρχή τη γραμμή:
- Κώδικας: Επιλογή όλων
 #include "stack.h"
 (μη σε απασχολούν οι γραμμές: #ifndef STACK_H και #endif για τώρα). Χωρίς αυτό το include το compilation του stack.c θα χτύπαγε!
Όταν κάνεις include ένα αρχείο μέσα σε ένα άλλο, τότε αυτό που συμβαίνει είναι πως τα περιεχόμενα του included αρχείου αντιγράφονται στο σημείο που υπάρχει η γραμμή #include. Η απόφαση να μπουν σε ξεχωριστό .h αρχείο τα macros, τα πρότυπα και οι πρόσθετοι τύπο δεδομένων των στοιβών πάρθηκε διότι αυτά θέλω να τα χρησιμοποιήσω ΚΑΙ στο αρχείο: main.c
Αντί λοιπόν να τα ξαναγράφω και στο main.c απλά κάνω πάλι ένα: #include "stack.h" και στην αρχή του main.c.
Oι γραμμές: #ifndef STACK_H και #endif που περικλείουν τη γραμμή του #include (και σου είπα παραπάνω να τις αγνοήσεις) είναι για να σιγουρέψουν πως τα περιεχόμενα του αρχείου: stack.h θα γίνουν compiled μια μόνο φορά για όλο το πρόγραμμα και όχι πολλές φορές (μια για κάθε .c αρχείο που κάνει include αυτό το header file). Και να μην τις βάλεις, δεν υπάρχει πρόβλημα, απλά θα καθυστερήσει λιγάκι ο χρόνος του compilation. Ονομάζεται "
Include Guard", αλλά για να μην πλατιάσουμε πολύ, διάβασε λεπτομέρειες εδώ: 
http://en.wikipedia.org/wiki/Include_guardΤο ίδιο ακριβώς πράγμα κάνω και με το αρχείο: s.h που το κάνω κι αυτό include στο αρχείο: main.c προκειμένου να μπορώ να χρησιμοποιήσω μέσα στο main.c τις συναρτήσεις διαχείρισης strings, που έχω ορίσει στο αρχείο: s.c. Σε αντίθεση με το stack.h, το s.h περιέχει μονάχα τα πρότυπα των συναρτήσεων του αρχείου: s.c (αν οι συναρτήσεις χρειάζονταν εξειδικευμένα macros, πρόσθετους τύπους, κλπ θα τα είχα γράψει κι αυτά μέσα στο s.h, αλλά οι συγκεκριμένες δεν χρειάζονται).
Οπότε πιστεύω πλέον να είναι ξεκάθαρος ο ρόλος των header file (αν όχι, εδώ είμαστε 

 )
Πες τώρα πως το αρχείο s.c θέλεις να το κάνεις βιβλιοθήκη, μιας και οι συναρτήσεις που περιέχει είναι τελείως γενικής φύσεως και μπορούν να χρησιμοποιηθούν ατόφιες όπως είναι όχι μόνο στο πρόγραμμα της ξερής, αλλά και σε οποιοδήποτε άλλο πρόγραμμα (το ίδιο πράγμα δεν ισχύει για τις συναρτήσεις των στοιβών στο stack.c, γιατί εκείνες είναι εξαρτημένες από τον τύπο int στο πεδίο data, ενώ σε άλλα προγράμματα μπορεί οι στοίβες να μην δέχονται int αλλά άλλον τύπο δεδομένων).
Θα χρησιμοποιήσεις λοιπόν την διαδικασία που σου περιέγραψα στο προηγούμενο post για να κάνεις compile μονάχα το αρχείο: s.c και κατόπιν με το εργαλείο ar θα μετατρέψεις το object file: s.o σε βιβλιοθήκη, με όνομα π.χ.: libs.a
Αντιγράφοντας τώρα το αρχείο: 
libs.a στον στάνταρ φάκελο 
/lib του gcc, και το αρχείο: 
s.h στον στάνταρ φάκελο 
/include του gcc, μπορείς πια σε ΟΠΟΙΟΔΗΠΟΤΕ πρόγραμμα φτιάχνεις να γράφεις στην αρχή του .c αρχείου του: "include <s.h> ώστε να χρησιμοποιήσεις οποιαδήποτε από τις συναρτήσεις στη βιβλιοθήκη: libs.a (που είναι δηλαδή οι συναρτήσεις του s.c). Εννοείται πως το αρχείο: s.c δεν χρειάζεται πια να το συμπεριλαμβάνεις στο compilation των προγραμμάτων, αφού το έχεις κάνεις βιβλιοθληκη (libs.a).
Θα πρέπει όμως στη γραμμή εντολών του gcc να του πεις να συμπεριλαμβάνει την βιβλιοθήκη στο compilation:
- Κώδικας: Επιλογή όλων
 
gcc blablabla -ls
Οπότε όπως καταλαβαίνεις, με αυτό τον τρόπο όσο περνάει ο καιρός θα έχεις φτιάξει δικές σου βιβλιοθήκες που θα τις χρησιμοποιείς κατά βούληση σε όποιο νέο πρόγραμμα φτιάχνεις, χωρίς να ξαναγράφεις κώδικα για τις συναρτήσεις αυτών των βιβλιοθηκών 
ΥΓ. Ας κάνει ένας moderator τον κόπο να μεταφέρει όλα τα posts που εξηγούν τα περί header files και libraries είτε σε ξεχωριστό νήμα, είτε σε πιο κατάλληλο. Είναι λίγο κρίμα να μείνουν "θαμμένα" σε άσχετο με το αντικείμενό τους νήμα.