[RISOLTO]Problema creazione librerie C

di il
6 risposte

[RISOLTO]Problema creazione librerie C

Salve devo svolgere questo esercizio ma non capisco dove sto sbagliando...devo implementare la seguente interfaccia:
typedef struct list* list_l;
list_l *createList();                         // crea una lista vuota   
int destroyList(list_l *L);               // libera tutta la memoria allocata dalla lista
int insertList(list_l *L, const char *);  // inserisce una parola nella lista
void printList(list_l *L);                 // stampa tutta la lista
questa l'ho salvata in un file chiamato libList.h

poi li ho implementati così:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "libList.h"

typedef struct list{
    const char word[1024];
    struct list *next;
}list_l;

list_l *createList(){
    list_l *head=NULL;
	return head;
}

int destroyList(list_l *L){
    if(L==NULL){
        return -1;
    }
    while(L!=NULL){
        list_l *occ=L->next;
        free(L);
        L=occ;
    }
    return 0;
}

int insertList(list_l *L, const char *c){
    list_l *new=malloc(sizeof(list_l));
    if(L==NULL){
        L=new;
        return 0;
    }
    list_l *occ=L;
    list_l *prev=NULL;
    strcpy(new->word,c);
    while(strcmp(occ->word,c)>1){
        prev=occ;
        occ=occ->next;
    }
    if(prev==NULL){
        new->next=L;
        L=new;
    }else{
        prev->next=new;
        new->next=occ;
    }
    return 0;
}

void printList(list_l *L){
    if(L==NULL){
        printf("LA LISTA E' VUOTA!!!!\n");
    }else{
        list_l *occ=L;
        while(occ!=NULL){
            printf("%s\n",occ->word);
            occ=occ->next;
        }
    }
}
e devo creare in questo modo una libreria statica da utilizzare in qualsiasi proramma esterno....appena compilo l'implementazione dell'interfaccia mi da ad ogni funzione errore:
  • implementa.c:9:2: error: conflicting types for ‘list_l’
    }list_l;
    ^~~~~~
    In file included from implementa.c:4:0:
    libList.h:1:22: note: previous declaration of ‘list_l’ was here
    typedef struct list* list_l;
    ^~~~~~
    implementa.c:11:9: error: conflicting types for ‘createList’
    list_l *createList(){
    ^~~~~~~~~~
    In file included from implementa.c:4:0:
    libList.h:2:9: note: previous declaration of ‘createList’ was here
    list_l *createList(); // crea una lista vuota
    ^~~~~~~~~~
    ///e lo stesso per le altre....
Dove sto sbagliando??

6 Risposte

  • Re: [RISOLTO]Problema creazione librerie C

    Beh, hai scritto

    typedef struct list * list_l;

    e anche

    typedef struct list { ...} list_l;


    Quale delle due è quella corretta?
  • Re: [RISOLTO]Problema creazione librerie C

    In effetti nell'interfaccia data dal professore la prima non c'era però se non la metto mi da errore di tipo non dichiarato di list_l nel file .h
    Navigando un po' nel web ho visto ci sono molte implementazioni di librerie differenti mi sono basato su quella del pdf: http://www.astromoodle.altervista.org/download/libreriec.pdf (ma ovviamente mi ha portato in errore).
    Ho provato a definire la struct direttamente nel file .h e non mi da errore...però non so se è una cosa "corretta da fare" data l'interfaccia dal professore in quella maniera...
    Quindi la struct dove la devo definire nel file .h o in quello del .c ? e se mi puoi spiegare il perchè della scelta mi fai un doppio favore così capisco anche a livello concettuale
  • Re: [RISOLTO]Problema creazione librerie C

    Perché la struct non sta nel file .h ?
  • Re: [RISOLTO]Problema creazione librerie C

    L'interfaccia data dal professore era così :
    list_l *createList();                         // crea una lista vuota   
    int destroyList(list_l *L);               // libera tutta la memoria allocata dalla lista
    int insertList(list_l *L, const char *c);  // inserisce una parola nella lista
    void printList(list_l *L);                 // stampa tutta la lista
    Solo le funzioni...ci sta che si sia sbagliato e mi ha fatto perdere del tempo e basta ahahah Alla fine ora mi funziona quindi probabilmente se lo è dimenticato.

    Un altra cosa ma una volta creata la libreria .a con i comandi :
    $ gcc ­c implementa.c
    $ ar ruv implementa.a implementa.o
    se voglio usarla in un programma come devo fare? Ho provato a mettere #include "implementa.a" ma sono venuti dei simboli strani e una valanga di errori
  • Re: [RISOLTO]Problema creazione librerie C

    Intanto è

    gcc -c implementa.c

    per creare il file oggetto.

    Poi crei la libreria con

    ar -ruv libimplementa.a implementa.o

    La libreria è codice compilato ! Non puoi includerlo in un sorgente, che è testo.
    Nel tuo codice includi il file .h e poi per compilare

    gcc programma.c -limplementa -o programma
  • Re: [RISOLTO]Problema creazione librerie C

    Mi da questo errore :
    /usr/bin/ld: impossibile trovare -limplementa
    collect2: error: ld returned 1 exit status
    
    P.S.
    Per chi avesse il mio stesso problema scrivo la soluzione con la quale sono riuscito ad utilizzare la libreria creata... Ho trovato l'errore prima di "-limplementa" va inserito "-L." (ovviamente senza le virgolette...dopo il punto va messa la directory di dove si trova la nostra libreria).
Devi accedere o registrarti per scrivere nel forum
6 risposte