0
votes

This is a sample program i was trying to compile this below c program to know about the make file.

main.c

#include<stdio.h>
#include "reciprocal.h"
int main(int argc,char **argv){
 int i;
 i=atoi(argv[1]);
 printf("The Reciprocal of %d is %f\n ",i,reciprocal(i));
 return 0;
}

reciprocal.c

#include<stdio.h>
#include<assert.h>
#include "reciprocal.h"
double reciprocal(int i){
assert(i!=0);
return 1.0/i;
}

reciprocal.h

#include<stdio.h>
#ifdef __cplusplus 
extern "C"{
#endif
extern double reciprocal(int i);
#ifdef __cplusplus
}   
#endif 

makefile

CFLAGS:=-o2
reciprocal: reciprocal.o main.o
        gcc $(CFLAGS) -o reciprocal.o main.o
main.o: main.c reciprocal.h
        gcc $(CFLAGS) -c main.c -I ../include 
reciprocal.o: reciprocal.c reciprocal.h
        gcc $(CFLAGS) -c reciprocal.c -I ../include 
clean: 
        rm -f *.o reciprocal

when compiled as below it throws an error.

% make

gcc -o2 -c reciprocal.c -I ../include gcc -o2 -c main.c -I ../include gcc -o2 -o reciprocal.o main.o main.o: In function main': main.c:(.text+0x25): undefined reference toreciprocal' collect2: ld returned 1 exit status make: * [reciprocal] Error 1

Please help me understand what is the reason for this error.

2

2 Answers

3
votes

Change your makefile:

reciprocal: reciprocal.o main.o
        gcc $(CFLAGS) -o reciprocal reciprocal.o main.o
                         ^^^^^^^^^^

Alternatively:

reciprocal: reciprocal.o main.o
        gcc $(CFLAGS) -o $@ $^
3
votes

You have an insidious typo:

CFLAGS:=-o2

That should have been -O2 with a capital O, this way you redirect the output of every compilation to the file 2.