makefile给出错误未定义的引用'main'

时间:2013-09-06 14:27:21

标签: c makefile

生成文件:

all: a.out

a.out: b.o a.o 
    gcc -o b.o a.o

a.o: a.c 
    gcc -c a.c

b.o: b.c 
    gcc -c b.c

.PHONY:clean

clean:
    rm *.o a.out

使用make,提供信息:

  

错误:对'main'的未定义引用

     

collect2:ld返回1

     

make: * [a.out]错误1

但是当将源文件a.cb.c放入Eclipse CDT时,它编译得很好。 请解释我makefile的错误?

PS: 交流转换器:

int global_1 = 100;

b.c:

extern int global_1;

int main()
{
    int global_2 = global_1 * 2;
    return 0;
}

2 个答案:

答案 0 :(得分:1)

此规则未指定正确的结果文件:

a.out: b.o a.o 
    gcc -o b.o a.o

应该是

a.out: b.o a.o 
    gcc -o "$@" b.o a.o

这是违反Paul's Rules of Makefiles之一的原因。顺便说一句,它不是“给出错误”的makefile,而是编译,特别是链接器。

答案 1 :(得分:0)

此:

a.out: b.o a.o 
    gcc -o b.o a.o
        \----/
           |
           |
     this says "name
     the output b.o"

用输出文件覆盖b.o目标文件。我很确定make足够聪明,可以在没有任何输入的情况下计算出所需的命令,所以请尝试删除第二行。