prog.c ------ .... .... .... .... <-- say change one part of this line .... .... .... .... .... .... .... .... .... .... .... ....
factorial.c
main()
/* |main.c|: main file for program demonstrating |factorial()| of prog.-arg. */ #include <stdio.h> #include <stdlib.h> int factorial(int); int main(int argc, char * argv[]) { int n; if( argc != 2 ) { fprintf(stderr, "%s requires one integer argument\n", argv[0]); return EXIT_FAILURE; } n = atoi(argv[1]); printf("factorial(%i) == %i\n", n, factorial(n)); return EXIT_SUCCESS; }
/* |factorial.c|: module providing |factorial()| function * calculating the factorial |n!| for the given integer |n| */ int factorial(int); /* include for consistency: if change function to return |double| * to handle larger numbers (or another time change back to |int|s * for precision and efficiency) and have this declaration, compiler * catches immediately. Otherwise error not caught until linking. */ int factorial(int n) { int result = 1; for ( int i = 1; i < n; i++ ) result *= i; return result; }
$
$ ls Makefile factorial.c main.c $
$ make
$ gcc -std=c99 -Wall -g -c factorial.c gcc -std=c99 -Wall -g -c main.c gcc main.o factorial.o -o factorial $ ls Makefile factorial.c main.c factorial factorial.o main.o $ $ factorial 5 factorial(5) == 120 $
factorial()
for
while
gcc -std=c99 -Wall -g *.c
while ( n > 1 ) result *= n--;
$ gcc -std=c99 -Wall -g -c factorial.c gcc main.o factorial.o -o factorial $ factorial 5 factorial(5) == 120 $
$ gcc -std=c99 -Wall -g main.c Undefined first referenced symbol in file factorial(int) /var/tmp/cc92gL8D.o ld: fatal: Symbol referencing errors. No output written to a.out collect2: ld returned 1 exit status $
$ gcc -std=c99 -Wall -g factorial.c Undefined first referenced symbol in file main /fs/net/pkg/GNU/gcc/gcc-2.95.2/i386-SunOS5.7/lib/gcc-lib/i386-pc-solaris2.7/2.95.2/crt1.o ld: fatal: Symbol referencing errors. No output written to a.out collect2: ld returned 1 exit status $
ctrl-T
vi
# basic |Makefile| for program demonstrating |factorial()| of prog.-arg. factorial : main.o factorial.o gcc main.o factorial.o -o factorial gcc -std=c99 -Wall -g -c main.c factorial.o : factorial.c gcc -std=c99 -Wall -g -c factorial.c
Makefile
make
# |makefile| for program demonstrating |factorial()| of prog.-arg. # taking advantage of |make|-macros i.e. abbreviations and defaults # re suffixes, 'Automatic Variables' OBJS = main.o factorial.o CC = gcc CFLAGS = -std=c99 -Wall -g factorial : $(OBJS) $(CC) $^ -o $@ # that's all that's needed!
aux.c
aux
main.c
aux.h
#include
<...>
"..."
/* |factorial.h|: header-file for module providing |factorial()| function */ int factorial(int);
/* |main.c|: main file for program demonstrating |factorial()| of prog.-arg. */ #include <stdio.h> #include <stdlib.h> int main(int argc, char * argv[]) { ... }
/* |factorial.c|: [...] */ #include "factorial.h" /* include for consistency: if change function to return |double| * to handle larger numbers (or another time change back to |int|s for * precision and efficiency) and have this |#include|, compiler catches * immediately. Otherwise error not caught until linking. */ int factorial(int n) { ... }
# basic |Makefile| for program demonstrating |factorial()| of prog.-arg. factorial : main.o factorial.o gcc main.o factorial.o -o factorial main.o : main.c factorial.h gcc -std=c99 -Wall -g -c main.c factorial.o : factorial.c factorial.h gcc -std=c99 -Wall -g -c factorial.c
# |Makefile| for program demonstrating |factorial()| of prog.-arg. # using |make|-macros i.e. abbreviations and defaults re suffixes, # 'Automatic Variables' OBJS = main.o factorial.o CC = gcc CFLAGS = -std=c99 -Wall -g factorial: $(OBJS) $(CC) $^ -o $@ main.o: factorial.h factorial.o: factorial.h
gcc -MM
main.o: ...
factorial.o: ...
$ gcc -MM factorial.c factorial.o: factorial.c factorial.h $
factorial.o: factorial.c
factorial.o: factorial.h
factorial.o: factorial.c factorial.h
.c
#include $aux$.c