为什么我的makefile中的自动变量找不到任何目标?

时间:2013-09-09 06:38:52

标签: makefile gnu-make

我在hello.c中写了这个问候世界:

#include <stdio.h>

int main() {
  printf("Hello, World!\n");
  exit( 0 );
}

我的Makefile是:

%: %.c

当我运行make时,我会收到此错误:make: *** No targets. Stop.

2 个答案:

答案 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