Foros del Web » Programación para mayores de 30 ;) » C/C++ »

referencia indefinida al compilar

Estas en el tema de referencia indefinida al compilar en el foro de C/C++ en Foros del Web. Hola, cuando compilo un programa con varios archivos individuales me da fallo en el main: El error es este: ciclistas_main.c:(.text+0x127): undefined reference to `actualizar_tiempos' collect2: ...
  #1 (permalink)  
Antiguo 29/05/2010, 05:03
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
referencia indefinida al compilar

Hola, cuando compilo un programa con varios archivos individuales me da fallo en el main:
El error es este: ciclistas_main.c:(.text+0x127): undefined reference to `actualizar_tiempos'
collect2: ld devolvió el estado de salida 1

Código C:
Ver original
  1. #include "ciclistas.h"
  2.  
  3. int main(){
  4.          void crear_fich();
  5.          void actualizar_tiempos(FILE *);
  6.          void clasif_por_equipos(FILE *);
  7.          void ordenar_por_tiempo(FILE *);
  8.      void listar_por_tiempo(FILE *);
  9.      void listar_por_tiempo_y_equipos(FILE *);
  10.      int baja(FILE *);
  11.      void media_total(FILE *);
  12.          void listar_por_la_media_de_tiempo_cada_equipo(FILE *);
  13.  
  14.          FILE * pf; /* Puntero al fichero */
  15.          char op;
  16.        
  17.         if((pf = fopen("tour_france.dat", "rb+")) == NULL) {/* Abre el fichero para trabajar con él en Lectura / Escritura */
  18.            crear_fich();/* Si no existe, ejecuta el módulo que lo cree */
  19.        
  20.            if((pf = fopen("tour_france.dat", "rb+")) == NULL) {/* Una vez creado lo habre en lectura/escritura */
  21.         perror("Fichero no accesible");
  22.                 exit(1);
  23.        }
  24.         }
  25.        
  26.         do {
  27.             printf("Elija opción:\na--> Crear el fichero del Tour\nb--> Actualizar tiempo\nc--> Clasificación por equipos\n");
  28.         printf("d--> Ordenar el fichero por tiempos\ne--> Listar por tiempos\nf--> Listar por tiempos y equipos\ng--> Dar de baja dorsales\n");
  29.             printf("h--> Media total de los equipos\ni--> Media de cada equipo\nj--> Salir\n");
  30.    
  31.             do{
  32.                LEE_CAR(op);
  33.             }while((op < 'a') || (op > 'j'));
  34.        
  35.         switch(op) {
  36.             case 'a': { crear_fich(pf);
  37.                    
  38.                     if((pf = fopen("tour_france.dat", "rb+")) == NULL) {/* Una vez creado lo habre en lectura/escritura */
  39.                     perror("Fichero no accesible");
  40.                             exit(2);
  41.                     }
  42.                     break; }
  43.                         case 'b': { actualizar_tiempos(pf); break; }
  44.                         case 'c': { clasif_por_equipos(pf); break; }
  45.                         case 'd': { ordenar_por_tiempo(pf); break; }
  46.             case 'e': { listar_por_tiempo(pf); break; }
  47.             case 'f': { listar_por_tiempo_y_equipos(pf); break; }
  48.             case 'g': { if(baja(pf) == 0) {
  49.                     /* El borrado ha sido correcto y abre el fichero */
  50.                     if((pf = fopen("tour_france.dat", "rb+")) == NULL) {
  51.                         perror("Fichero no accesible");
  52.                                 exit(3);
  53.                         }
  54.                      }
  55.                      else {
  56.                         printf("Error al eliminar un corredor, el fichero no se ha modificado, compruebe sus datos\n");
  57.                      }
  58.                      break; }
  59.  
  60.                 case 'h': { media_total(pf); break; }
  61.                         case 'i':{listar_por_la_media_de_tiempo_cada_equipo(pf) ;break;}
  62.                 } /* switch */
  63.     }while (op!= 'j');
  64.         if(fclose(pf) == EOF)
  65.         printf("Error al cerrar el fichero, compruebe si ha perdido información\n");
  66.         exit(0);
  67. } /* main() */

A ver si alguien me puede ayudar a encontrar el fallo. Gracias.
  #2 (permalink)  
Antiguo 29/05/2010, 11:43
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: referencia indefinida al compilar

En el archivo que pasaste no esta la definicion de esa funcion.

Seguramente incluiste en el archivo "ciclistas.h" la declaracion de la funcion. Pero que pasa, a la hora de comnpilar capas que estas haciendo
gcc main.c

Y ahi falla porque tenes que pasarle a la hora de compilar el archivo donde la tenes definida. Osea

gcc main.c ciclistas.c
  #3 (permalink)  
Antiguo 29/05/2010, 12:17
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: referencia indefinida al compilar

Sigo sin entender por qué me da fallo, respecto a lo que dices del archivo ciclistas.h sólo tengo esto:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5.  
  6. #define N_EQUIPOS 10
  7. #define T_EQUIPO 21
  8. #define T_NOM 51
  9. #define T_APELL 101
  10. #define T_NACION 31
  11.  
  12. typedef struct {
  13.     int dorsal;
  14.     char equipo[N_EQUIPOS];
  15.     char nom[T_EQUIPO];
  16.     char apell[T_NOM];
  17.     char nacion[T_APELL];
  18.     double tiempo;
  19. } ciclista;
  20.  
  21.  
  22. #define LEE_CAR(c)\
  23.         c=getchar();\
  24.         while((c=='\n') || (c==' ') || (c=='\t'))\
  25.             c=getchar();
  26.  
  27. #define LEE_CAD(c,n) { int i=0; \
  28.                      c[i]=getchar();\
  29.              while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
  30.              while ((c[i]!='\n') && (i < (n-1))){ \
  31.                 i++;\
  32.             c[i]=getchar(); }\
  33.              c[i]='\0'; }

Compilo estos archivos excepto el de ciclistas.h: gcc ciclistas_main.c ciclistas_alta.c clasif_por_equip.c listar_por_tiempo.c listar_por_tiempo_y_equip.c ordenar_fich_por_tiempo.c media_total.c media_de_cada_equip.c dar_de_baja.c
  #4 (permalink)  
Antiguo 29/05/2010, 12:35
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: referencia indefinida al compilar

Eso ya lo he solucionado, ahora cuando compilo me da un error donde no lo hay, creo:

Código C:
Ver original
  1. #include "ciclistas.h"
  2.  
  3. void crear_fich(FILE* pf) {
  4.          char otro;
  5.          ciclista nuevo_corredor;
  6.  
  7.      if((pf = fopen("tour_france.dat", "wb")) == NULL) {
  8.         perror("Al crear el fichero de Tour de Francia");
  9.                 exit(2);
  10.          }
  11.          
  12.          /* Lectura de los ciclistas */
  13.          do {
  14.                 printf("Deme el dorsal(entero):");
  15.                 scanf("%d",&nuevo_corredor.dorsal);
  16.                 printf("Equipo: ");
  17.                 LEE_CAD(nuevo_corredor.equipo, T_EQUIPO);
  18.         printf("Nombre: ");
  19.                 LEE_CAD(nuevo_corredor.nom, T_NOM);
  20.         printf("Apellidos: ");
  21.                 LEE_CAD(nuevo_corredor.apell, T_APELL);
  22.         printf("Nacionlidad: ");
  23.                 LEE_CAD(nuevo_corredor.nacion, T_NACION);
  24.         nuevo_corredor.tiempo = 0.0;
  25.                 /*Escribe el corredor en el fichero */
  26.                 fwrite(&nuevo_corredor, sizeof(ciclista),1, pf);
  27.         printf("¿Otro? (s/n) ");
  28.                 LEE_CAR(otro);
  29.     }while((otro=='s') || (otro=='S'));
  30.     if(fclose(pf) == EOF){
  31.         printf("Error al cerrar el fichero, compruebe si hay información\n");  
  32.                 exit(3);
  33.         }
  34. } /* crear_fich()*/

Este es el error: En la función ‘crear_fich’:
actualizar_tiempos.c:19: error: ‘NOM_EQUIPO’ no se declaró aquí (primer uso en esta función)
actualizar_tiempos.c:19: error: (Cada identificador no declarado solamente se reporta una vez
actualizar_tiempos.c:19: error: para cada funcion en la que aparece.)

Etiquetas: compilar, referencia
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:19.