我在hello.c
中写了这个问候世界:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
exit( 0 );
}
我的Makefile
是:
%: %.c
当我运行make
时,我会收到此错误:make: *** No targets. Stop.
答案 0 :(得分:5)
您的makefile提供规则 %: %.c
,指明您感兴趣的无扩展程序可执行文件和 .c 文件(在事实上,只是内置规则做了那么多,但没有提示有一个名为hello.c
的源文件或名为hello
的目标。
当你自己键入make
时,make会将makefile中列出的第一个目标作为目标,但你的makefile不包含任何目标,因此没有目标。停止的。简而言之,make并不知道附近有任何名称如hello*
。
使用您的makefile,输入make hello
将会执行您想要的操作,因为它会告诉您要构建的内容。
如果你告诉make hello
,你也可以只输入make
来做你想做的事情:
hello: hello.c
%: %.c
或更具惯用性和灵活性,您可以列出所有&#34;顶级&#34; all
目标中的目标:
all: hello
%: %.c
.PHONY: all
答案 1 :(得分:1)
典型的c hello world prgram:
的hello.c:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
典型的Makefile,简短但完整:
生成文件:
all: hello
hello: hello.o
gcc -o "$@" hello.o
hello.o: hello.c
g++ -c hello.c
.PHONY:clean
clean:
rm *.o hello
模式规则示例:
all: hello
hello: hello.o
gcc -o "$@" hello.o
%.o: %.c
gcc -c $<
.PHONY:clean
clean:
rm *.o hello
带分隔符的示例(\n
为输入,\t
为标签符号):
all: hello\n
hello: hello.o\n
\tgcc -o "$@" hello.o
%.o: %.c\n
\tgcc -c $<
.PHONY:clean
clean:\n
\trm *.o hello