PDA

Visualizza la versione completa : Errori e warning su comando "make"


superpaul82
06-05-2006, 14:41
come da titolo non riesco ad utilizzare questi file assieme...credo (sottolineo credo perchè potrebbe essere una supidata galattica (sono un niubbo di C..)) si un problema di link..

i file sono:

main.c

/*
* more
* main subroutine - copy input to output
*/

#include <stdio.h>

int main()
{
int ch, colcnt, rowcnt;

colcnt = 1;
rowcnt = 1;
while ( (ch = getchar()) != EOF )
{
putchar(ch);
if ( more(ch, &colcnt, &rowcnt) == 0 )
{
break;
}
}
exit(0);
}


more.c

/*
* more
* more subroutine - controls command prompting
* base on screen size
*/

#include "defs.h"

int more(char ch, int *colcnt, int *rowcnt) {
int Value; /* returned by this function */

if ( ch == '\n' || *colcnt >= LINESIZE )
{
*colcnt = 1;
(*rowcnt)++;
} else
{
(*colcnt)++;
}
if ( *rowcnt == SCRNSIZE )
{
Value = command(rowcnt);
} else
{
Value = 1;
}
return(Value);
}


command.c

/*
* more
* command subroutine - prompts for command
*/

#include <stdio.h>
#include "defs.h"

int command(int *rowcnt)
{
static FILE *fp = NULL;
int Ch, Value;

if ( fp == NULL )
{
fp = fopen("/dev/tty", "r");
}
printf("more?");
fflush(stdout);
if ( (Ch = getc(fp)) == ONELINE )
{
*rowcnt = SCRNSIZE - 1;
Value = 1;
} else if ( Ch == ONESCREEN )
{
*rowcnt = 0;
Value = 1;
} else
{
Value = 0;
}
while ( Ch != EOF && Ch != '\n' )
{
Ch = getc(fp);
}
return(Value);
}


defs.h

/*
* more
* definitions
*/

#define SCRNSIZE 23
#define LINESIZE 80
#define ONELINE '\n'
#define ONESCREEN ' '


makefile

#
# makefile per costruire il file eseguibile More
#
# Seguono le definizioni di alcune macro
#
CC = gcc
SRC = main.c more.c command.c
DEF = defs.h
OBJ = $(SRC:.c=.o)

# La macro $@ prende il nome del target corrente More

More: $(OBJ)
$(CC) $(OBJ) -o $@
.c.o:
$(CC) -c $<

# Si puo' utilizzare anche la dipendenza implicita dei target,
# dettata dal suffisso .c, cosicche' e' sufficiente scrivere
# solamente le regole dove compare la dipendenza esplicita da
# "defs.h"

more.o: $(DEF)
command.o: $(DEF)


clean:
/bin/rm -f $(OBJ) More *~


teoricamente lanciando il comando make dovrebbe crearsi l'eseguibile..
ma non mi succede...
mi ritovo pieno di error e warning.. sapreste aiutarmi??grazie!!

andbin
06-05-2006, 16:17
Io ho copiato tutti i file che hai postato su una linux box e li ho provati. Ho solamente aggiunto un -Wall nel makefile per la fase di compilazione dei sorgenti.
Risultato:

gcc -Wall -c main.c
main.c: In function `main':
main.c:17: warning: implicit declaration of function `more'
main.c:22: warning: implicit declaration of function `exit'
gcc -Wall -c more.c
more.c: In function `more':
more.c:22: warning: implicit declaration of function `command'
gcc -Wall -c command.c
gcc main.o more.o command.o -o More
I warning sono dovuti al fatto che nei sorgenti non hai dichiarato le funzioni presenti negli altri sorgenti. Nel main.c, per esempio, hai usato la funzione more() senza averla dichiarata.

superpaul82
06-05-2006, 16:41
ho aggiunto -Wall nel file make file così:

CC = gcc -Wall
SRC = main.c more.c command.c
DEF = defs.h
OBJ = $(SRC:.c=.o)


questo è il mio risultato della compilazione..

paul@linux:~/Desktop/prova> make
gcc -Wall -c -o main.o main.c
main.c: In function ‘main’:
main.c:17: warning: implicit declaration of function ‘more’
main.c:22: warning: implicit declaration of function ‘exit’
main.c:22: warning: incompatible implicit declaration of built-in function ‘exit’
gcc -Wall -c -o more.o more.c
more.c: In function ‘more’:
more.c:22: warning: implicit declaration of function ‘command’
more.c:28:3: warning: no newline at end of file
gcc -Wall -c -o command.o command.c
command.c:37:3: warning: no newline at end of file
make: *** No rule to make target `gcc', needed by `More'. Stop.

però ancora non va..

andbin
06-05-2006, 16:45
Originariamente inviato da superpaul82
però ancora non va.. Allora:
1) Dichiara nei sorgenti le funzioni che usi e che sono implementate in altri sorgenti.
2) Assicurati che nel makefile i comandi delle regole abbiano 1 TAB davanti.
3) Per usare la funzione exit() devi includere anche stdlib.h

superpaul82
07-05-2006, 10:52
scusa se ti rompo ancora, ma anch dopo aver ricontrollato il makefile ancora non va...
potresti, per favore, mandarmi via mail o via mp i tuoi file?grazie mille!

mi ritorna sempre questo errore...
make: *** No rule to make target `gcc', needed by `More'. Stop.

se riesci a mandarmi i tuoi file te ne sarei veramente grato!
intanto grazie comunque!

superpaul82
08-05-2006, 15:09
sono riuscito a farlo andare!!grazie mille!
però adesso ho un dubbio..
e volessi selezionare certe righe di un file con questo metodo come dovrei fare?
il file lo cambio nel file command.c vero?al posto di /dev/tty ci metto miofile?
Però per partire da una riga in particolare passatagli dal main?
Grazie in anticipo!!

Loading