0

Tengo el archivo .c con la funcion que quiero invocar

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "entrada_minishell.h"

void imprimir_prompt()
{
   printf("minishell> "); 
   fflush(stdout);        
}
void leer_linea_ordenes(char *buf)
{

   memset(buf, 0, sizeof(BUFSIZ));

   if (fgets(buf, BUFSIZ-1, stdin) == NULL) /* fgets almacena la orden leída introduciendo también el carácter de fin de línea */
   { 
      buf[0] = '\0';
      return;
   }

   eliminar_salto_linea(buf);  
}

y su archivo .h

#ifndef ENTRADA_MINISHELL_H
#define ENTRADA_MINISHELL_H

void leer_linea_ordenes(char *cad);
void imprimir_prompt();

#endif

cuando quiero invocar la funcion desde otro archivo llamado minishell.c con el main()

  #include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include "internas.h"
#include "entrada_minishell.h"
#include "ejecutar.h"


int main(int argc, char *argv[])
{

   char buf[BUFSIZ];

   while (1)
   {
    imprimir_prompt();   
    leer_linea_ordenes(buf);

    if (strcmp(buf,"exit")==0){
        break;   
    }   

    else   
    {   
        if(es_ord_interna(buf)){
            ejecutar_ord_interna(buf);   
        }
        else{
            ejecutar_linea_ordenes(buf);
        }
     }  
   }

   return 0;    

}

me da este error: En la función 'main':/home/.../minishell.c:24: referencia a 'imprimir_prompt' sin definir

para compilarlo

CFLAGS= gcc -Wall -g

minishell: minishell.o entrada_minishell.o 
    gcc -Wall -g minishell.o entrada_minishell.o  -o  minishell 

entrada_minishell.o: entrada_minishell.c entrada_minishell.h
    $(CFLAGS) entrada_minishell.c -o entrada_minishell.o

minishell.o: minishell.c  
    $(CFLAGS) minishell.c -o minishell.o
hugoboss
  • 129
  • 11
  • Las dos funciones estan definidas, pero no habia añadido la declaracion de la segunda porque no me da error, ahora esta actualizado – hugoboss May 02 '18 at 10:44
  • 1
    Léete la respuesta completa, a partir de la *Explicación*. Así entenderás el problema y como solucionarlo: https://es.stackoverflow.com/a/65558/19610 – Trauma May 02 '18 at 10:49
  • @abulafia ¿ Porqué no pones tu comentario como respuesta, con el Makefile correcto ? – Trauma May 02 '18 at 14:37

1 Answers1

1

El problema está en el Makefile.

Cuando compilas un .c con la intención de crear un .o, debes pasar al compilador la opción -c, por ejemplo así:

gcc -c minishell.c

Puedes omitir en este caso el -o minishell.o, ya que por defecto creará un objeto con el mismo nombre que el fuente.

Sin la opción -c, gcc ejecutará en secuencia dos pasos: primero la compilación (que no daría errores en tu caso) y después el enlazado para crear un ejecutable (que en tu caso llevaría el nombre, erróneo, minishell.o, y no puede ser creado porque faltan funciones). No quieres que intente crear un ejecutable, sino que haga sólo la fase de compilación. Para eso es la opción -c.

Otro detalle, que no tiene relevancia para el error que comentas, pero que conviene hacer bien, es que CFLAGS se usa normalmente para contener las opciones de compilación, pero no el propio nombre del compilador que suele guardarse en cambio en la variable CC.

Por tanto, un Makefile más correcto sería:

CFLAGS=-Wall -g
CC=gcc

minishell: minishell.o entrada_minishell.o 
    $(CC) $(CFLAGS) minishell.o entrada_minishell.o  -o  minishell 

entrada_minishell.o: entrada_minishell.c entrada_minishell.h
    $(CC) $(CFLAGS) -c entrada_minishell.c

minishell.o: minishell.c  
    $(CC) $(CFLAGS) -c minishell.c

De hecho, puedes omitir el comando en todas tus reglas, ya, gracias a sus reglas implícitas, make conoce qué comando ha de ejecutar por defecto para crear un .o a partir de un .c, o un ejecutable a partir de varios .o. Basta por tanto que especifiques las dependencias y él deducirá el resto:

CFLAGS=-Wall -g
CC=gcc

minishell: minishell.o entrada_minishell.o 

entrada_minishell.o: entrada_minishell.c entrada_minishell.h

minishell.o: minishell.c  
abulafia
  • 53,696
  • 3
  • 45
  • 80