生成文件:
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.c
和b.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;
}
答案 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
足够聪明,可以在没有任何输入的情况下计算出所需的命令,所以请尝试删除第二行。