Scusate ho un problema con la compilazione di due moduli, praticamnete nel progetto ho due file:

main.c:
codice:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

#define COST_NUM_CHAR 30           //Costante utilizzata per indicare il numero massimo dei caratteri nella stringa
#define COST_ELEM_MAX 20           //Costante utilizzata per indicare il numero massimo degli elementi nel vettore



typedef char string[COST_NUM_CHAR];  //definizione di un nuovo tipo di dato chiamato "string"    

typedef enum{FALSE, TRUE} BOOLEAN;   /*definizione di un nuovo tipo di dato chiamato "BOOLEAN" avente due soli 
                                       valori accettati: "FALSE" (valore 0) e "TRUE" (valore 1)*/

void stampa(BOOLEAN RITORNO_ADD);   //funzione per avvisare l'utente se l'inserimento dei dati è avvenuto con successo  
struct StringPool acquisizione(); //funzione per far inserire all'utente i dati

struct StringPool
	{                                 //Struttura contenente due tipi di dati:         
		int identifier;               //"identifier":dato di tipo int     
		string str;                   //"str":dato di tipo string
	};
struct StringPool sp[COST_ELEM_MAX];  //definizione del vettore globale "sp" di grandezza "COST_ELEM_MAX"      
                                      //di tipo "StringPool"
#include "stringpool.c"    
int main()
{
    BOOLEAN NEW_INPUT=TRUE;
    BOOLEAN RITORNO_ADD;                //definizione variabili
    struct StringPool TEMP_DATA;
    int I=0;
    
    for(I=0;I<COST_ELEM_MAX;I++)
    {
       *sp[I].str='\0';               //ciclo utilizzato per inizializzare il vettore "sp" con i seguenti valori:
       sp[I].identifier=-1;           //il campo "identifier" viene inizializzato con il valore "-1"
    }                                 //il campo "str" viene inizializzato con la stringa vuota
     
    
    for(I=0;I<COST_ELEM_MAX && NEW_INPUT==TRUE;I++)
    {
       do{                     
           /*questo ciclo do-while viene eseguito per far inserire all'utente i dati.
           ciclerà fino a quando i dati immessi dall'utente non saranno inseriti nel vettore (cioè se si verifica
           la seguente condizione: RITORNO_ADD==FALSE) e se l'utente vorrà inserire nuovi dati 
           (ciè se si verifica la seguente condizione:NEW_INPUT==TRUE)*/
                               
           TEMP_DATA=acquisizione();   //viene chiamata la funzione "acquisizione" che ritorerà un dato di tipo 
                                       //StringPool che verrà salvato nella variabile "TEMP_DATA" 
         
           //QUI SI CHIAMA LA FUNZIONE ADD CHE RITORNA UN VALORE BOOLEAN ALLA VARIABILE RITORNO_ADD E SI INVIA
           //COME PARAMETRO LA VARIABILE TEMP_DATA
           add(TEMP_DATA.identifier,TEMP_DATA.str);//Richiamo la funzione add della libreria stringpool.c
         
           stampa(RITORNO_ADD);        //viene chiamata la funzione "stampa" che manderà a schermo un diverso
                                       //messaggio in base all'esito dell'inserimento  
         
           printf("\n Si vuole inserire un nuovo dato? (0=NO, 1=SI)");
           do{ 
              scanf("%d",&NEW_INPUT);                                 //ciclo che chiede all'utente se si vuole
             }while(NEW_INPUT<0 || NEW_INPUT>1);                      //inserire un nuovo dato.Il ciclo verrà 
                                                                      //eseguito fino a quando non si inserirà
                                                                      // o 1 o 0
                                                                      
         }while((NEW_INPUT==TRUE) && (RITORNO_ADD==FALSE));
    }                        
    
    system("pause");
    
}
    
struct StringPool acquisizione()
{
       struct StringPool TEMP_DATA;
       
       do{
            printf("\nInserire l'ID");                     //ciclo per l'inserimento dell'ID.Ciclerà
            scanf("%d",&TEMP_DATA.identifier);             //fino a quando non verrà immesso un numero positivo
         }while(TEMP_DATA.identifier<0);
       
       do{          
            printf("\nInserire la stringa");               //ciclo per l'inserimento della stringa.Ciclerà
            scanf("%s",TEMP_DATA.str);                     //fino a quando non verrà immessa una stringa 
         }while(*TEMP_DATA.str=='\0');                     //diversa dalla stringa vuota
         
      return(TEMP_DATA);   
}       

void stampa(BOOLEAN RITORNO_ADD)
{
   if(RITORNO_ADD==1)                
      printf("\nL'inserimento dei dati è avvenuto con successo");
   
   else
      printf("\nErrore: inserimento non avvenuto"); 
      
      /*in base all'avvenuto inserimento dei dati nel vettore, verrà stampato a video un messaggio diverso*/
                        
   system("pause");
}
ed una libreria chiamata stringpool.c:

codice:
BOOLEAN add (int identifier, string str);

BOOLEAN add (int identifier, string str)
{
    int spazio_vettore = -1; //Indice di controllo presenza spazio libero
    int i; //Indice per il ciclo for di scansione
    /*Se identifier hanno dati non corretti ritorna false*/
    if((identifier < 1) || (strcmp(str,"") != 0))
    {
       return 0;     
    }
    /*Controlla da 0 a minore del numero massimo di elementi
    che l'identifier non è dupplicato e che ci sia almeno uno spazio vuoto
    per l'inserimento*/
    for(i=0;i<COST_ELEM_MAX;i++)
    {
     //se l'indice è dupplicato ritorna false
        if(identifier == sp[i].identifier)    
        {
           return 0;              
        }             
     //in caso di presenza di spazio vuoto, segna la prima posizione libera
        if(sp[i].identifier == -1)
        {
           spazio_vettore = i;                    
        }       
    }
    
    //se tutto è andato a buon fine alloca i dati nella struttura
    if(spazio_vettore > -1)
    {
        sp[spazio_vettore].identifier = identifier;
        return 1;                
    }
    else
    {
        return 0;    
    }
    
    
    
}
E nel main sono dichiarate delle variabili globali che poi utilizzerà anche la libreria. Alla compilazione però il compilatore dice nella libreria che le variabili non sono state dichiarate e da errore. Come posso risolvere?