Newsgroup: it.comp.os.linux.development
Titolo: Problema con puntatori a funzione

Salve 
son sicuro che la domanda che sto per fare è veramente ma veramente
banale,
ma scusate non riesco a venirne a capo.Sono decisamente agli inizi...
Inizio a programmare in Linux e tra i primi esercizi che ho provato
vi è il seguente:
un'utility progettata su 4 file:
1)dos_cvrt.c che contiene il main()
2&3) che contengono 2 funzioni: int dos2unix(const char *pathname) e 
                                int unix2dos(const char *pathname) ;
4) il seguente file dos_cvrt.h:
#ifndef _dos_cvrt_h_
#define _dos_cvrt_h_ "@(#)dos_cvrt.h $Revision: 1.1 $"
extern int unix2dos(const char *pathname);
extern int dos2unix(const char *pathname);
#endif
La struttura del file contenente il main() è invece:
/*dos_cvrt.c:*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "dos_cvrt.h"
// qui definisco la funzione Basename(const char *path){....}
int main(int argc,char **argv) {
char *base_name = 0;    /* Basename of command */
int rc = 0;             /* Command return code */
int (*conv)(const char *pathname); /* Conv. Func. Ptr */
int x;
base_name = Basename(argv[0]);
if ( !strcmp(base_name,"unix_cvrt") )
     conv = unix2dos;         // riga 80 nel file originale
else
     conv = dos2unix;         // riga 82
for ( x=1; x<argc; ++x )
    if ( (rc = conv(argv[x])) != 0 )
        break;      /* An error occured */
    return rc;
}
Al momento in cui vado a compilare lancio il comando:
    gcc -Wall -g -D_GNU_SOURCE dos_cvrt.c -o dos_cvrt
e l'output risultante è:
/tmp/cc7YVIYm.o: In function `main':
/home/fabio/dos_cvrt/dos_cvrt.c:80: undefined reference to `unix2dos'
/home/fabio/dos_cvrt/dos_cvrt.c:82: undefined reference to `dos2unix'
collect2: ld returned 1 exit status
Non riesco a individuare l'errore e tra  l'altro questo è praticamente
un'esercizio preso col "copia e incolla" da un libro.
Qualcuno a voglia di darmi una dritta?
Ho riguardato la sintassi dei puntatori a funzione e mi sembra proprio
corretta, non so' che fare...
Grazie, saluti
                                          Chef

 collect2: ld returned 1 exit status
L'errore e' del linker e non del compilatore.
Se le 2 fn che il linker non riesce a risolvere sono nei 2 file omonimi,
prima devi compilarli come oggetto (gcc -c) e poi metterli insieme all'altro
nell'eseguibile.
gcc -c unix2dos.c
gcc -c dos2unix.c
gcc -c dos_cvrt.c
gcc *.o -o dos_cvrt
Impara a fare un Makefile o a usare autoconf/automake, risparmierai tempo.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! The Moment Is Now In All History, The Time Has Arrived And This Is The
  		One Place To Be. !>- Savatage - This Is The Time

Ciao,
Ancora non uso il make (detto brutalmente sto al cap. 4 del mio 
libro e il make verrà trattato più avanti).
Da quanto credo di intuire  i seguenti passi suggeriti corrispondono a:
1) gcc -c unix2dos.c    //COMPILAZIONE
2) gcc -c dos2unix.c    //COMPILAZIONE
3) gcc -c dos_cvrt.c    //COMPILAZIONE
4) gcc *.o -o dos_cvrt  //LINKAGGIO
Ancora: senza ricorrere al make file esiste un unico comando  che
effettui i passi precedenti in un solo colpo?
E soprattutto quali opzioni inserire per permettere il debugging?
Scusa se insisto ma la documentazione che ho a riguardo è veramente
scarsa e alla fine m'accorgo che è più il tempo passato sullo strumento
che quello passato sull'argomento (la programmazione)
Grazie
Giuseppe Corbelli ha scritto:


E soprattutto quali opzioni inserire per permettere il debugging?
Aggiungi l'opzione -g
Alessandro.