main.c :(。text + 0x25):未定义引用`reciprocal'

时间:2012-01-27 08:52:55

标签: c makefile

这是一个示例程序,我试图编译下面的c程序来了解这个 制作文件。

的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 

生成文件

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

如下编译时会抛出错误。

%make

  

gcc -o2 -c reciprocal.c -I ../include gcc -o2 -c main.c -I ../include   gcc -o2 -o reciprocal.o main.o main.o:在函数main': main.c:(.text+0x25): undefined reference to倒数'collect2:ld   返回1退出状态make: * [reciprocal]错误1

请帮助我了解出现此错误的原因。

2 个答案:

答案 0 :(得分:3)

更改你的makefile:

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

可替换地:

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

答案 1 :(得分:3)

你有一个阴险的错字:

CFLAGS:=-o2

这应该是-O2,其中包含大写O,这样您就可以将每个编译的输出重定向到文件2