Problema inclusione librerie C

di il
7 risposte

Problema inclusione librerie C

Ciao a tutti, ho un pproblema con due librerie che includono le stesse funzioni!
ho provato ad usare le direttive al preprocessore come ifndef e endif ....ma il compilatore mi da sempre il solito errore:


/tmp/ccYm367G.o: In function `Socket':
socketDatagram.c:(.text+0x0): multiple definition of `Socket'
/tmp/ccme103T.o:socketStream.c:(.text+0x0): first defined here
/tmp/ccYm367G.o: In function `Bind':
socketDatagram.c:(.text+0x74): multiple definition of `Bind'
/tmp/ccme103T.o:socketStream.c:(.text+0x74): first defined here
/tmp/ccYm367G.o: In function `Setsockopt':
socketDatagram.c:(.text+0x2af): multiple definition of `Setsockopt'
/tmp/ccme103T.o:socketStream.c:(.text+0x28e): first defined here
/tmp/ccYm367G.o: In function `Close':
socketDatagram.c:(.text+0x331): multiple definition of `Close'
/tmp/ccme103T.o:socketStream.c:(.text+0x310): first defined here
collect2: ld returned 1 exit status


i due file .h contengono in parte le stesse funzioni

socketStream.h

#ifndef __BASELIB_H__ 

#define __BASELIB_H__ 

//definisco librerie di base..
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>

#endif 

//definisco librerie aggiuntive

#include<signal.h>// per i segnali...
#include<netinet/in.h> //definiscono la struttura degli indirizzi e funzione del tipo ntohl
#include<arpa/inet.h>// tipi e funzioni per trattare indirizzi ip.
#include<sys/time.h>// necessaria per la funz select...contiene alcune utilita`
#include<sys/select.h> // funzione select..
#include <fcntl.h>

#ifndef __BASEFUN__

#define __BASEFUN__
int Socket(int domanin, int type, int protocol);
int Bind(int sockfd, const struct sockaddr* serv_addr, socklen_t addrlen);
int Close(int fd);
int Setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);
#endif



socketDatagram.h

#ifndef __BASELIB_H__ 

#define __BASELIB_H__ 

//definisco librerie di base..
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>

#endif 




#ifndef __BASEFUN__

#define __BASEFUN__
int Socket(int domanin, int type, int protocol);
int Bind(int sockfd, const struct sockaddr* serv_addr, socklen_t addrlen);
int Close(int fd);
int Setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);
#endif 


vengono incluse entrambe in un file che rappresenta il server...come mai ifned non mi impedisce di duplicare il codice? ..cosa sbaglio?



Grazie in Anticipo per la vostra risposta!!!

7 Risposte

  • Re: Problema inclusione librerie C

    Se socketDatagram.c che socketStream.c utilizzano le stesse funzioni dovresti creare un header comune ad entrambi ed includerlo nei singoli src.
    
    #ifndef __BASEFUN__
    #define __BASEFUN__
    ... aggiungere gli include necessari alle funzioni sotto...
    
    int Socket(int domanin, int type, int protocol);
    int Bind(int sockfd, const struct sockaddr* serv_addr, socklen_t addrlen);
    int Close(int fd);
    int Setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);
    #endif // __BASEFUN__
    
    Poi devi creare gil header per i due src contentente SOLO i prototypes delle funzioni utilizzate.
    ed includerle in socketDatagram.c e socketStream.c
    
    #include "basefun.h"
    #include "socketDatagram.h" (socketStream.h nel socketStream.c)
    
    Questa è la prassi...
  • Re: Problema inclusione librerie C

    Ciao!! Grazie per aver risposto!....Effettivamente cosi funziona bene!...solo che non capisco perche' prima non andava lo stesso bene con ifndef ed endif non dovrebbe funzionare come un filtro?
    ..cioe' per capirci faccio un esempio supponiamo di vere due file .h che hanno nomi diversi ma che all'interno sono identici
    
    #ifndef FUNZ
    #define FUNZ
    
    qui funzioni e lib annesse
    
    #endif
    
    se io ora include questi due file .h in un file.c
    
    #include"file1.h"
    #include"file2.h"
    
    ...........
    
    quindi il compilatore include file1 legge il blocco ifndef e definisce FUNZ....ma nella seconda inclusione ,invece, dovrebbe trovare gia' definito FUNZ e quindi non includere nulla!...o mi sbaglio?
    ....giusto per comprendere bene ifnedf ed endif



    Grazie in Anticipo per la risposta!!!
  • Re: Problema inclusione librerie C

    Se la direttiva è corretta funziona ugualmente.
    Quello che devi considerare non è dire 'funziona' o meno, ma sistemare secondo un ordine logico per evitare di aver problemi che vanno oltre il problema di una definizione multipla. Strutturalmente parlando una libreria non deve essere altro che un'insieme di librerie. Poi, per comodità o relazione puoi raggrupparle o meno.
    Ti voglio fare una domanda, secondo te è più facile leggere o scrivere software?
  • Re: Problema inclusione librerie C

    Eheheh....bhe' secondo il mio modesto parere la cosa piu' difficile e' leggerlo!!!...difficile comprendere un codice scritto da altri!!..
    ...quindi se ho capito cosi facendo il mio codice sarebbe piu leggibile??
  • Re: Problema inclusione librerie C

    Scusa se aggiungo una nuova domanda alla discussione ma gia' che mi ci trovo !!
    ho un problemino con la funzione open!!
    E' possibile usare la open per creare un file se non esiste e sovrascriverlo se esiste gia'?...tutto con un unica open?



    Grazie in anticipo per la tua risposta!
  • Re: Problema inclusione librerie C

    
    open(pathname, O_WRONLY|O_CREAT|O_TRUNC, mode);
    
    http://digilander.libero.it/uzappi/C/librerie/funzioni/open.html

    Prova











    SAY NO TO ACTA
  • Re: Problema inclusione librerie C

    Perfetto!!! Grazie Mille per la tua disponibilita'!!
Devi accedere o registrarti per scrivere nel forum
7 risposte