为什么makefile中的自动变量不';找不到目标?

为什么makefile中的自动变量不';找不到目标?,makefile,gnu-make,Makefile,Gnu Make,我在hello.c中写了这个hello world: #include <stdio.h> int main() { printf("Hello, World!\n"); exit( 0 ); } 当我运行make时,我将得到以下错误:make:**无目标。停止。典型的c hello world程序: 你好,c: #include <stdio.h> int main() { printf("Hello, World!\n"); return 0;

我在
hello.c
中写了这个hello world:

#include <stdio.h>

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

当我运行
make
时,我将得到以下错误:
make:**无目标。停止。

典型的c hello world程序:

你好,c:

#include <stdio.h>

int main() {
  printf("Hello, World!\n");
  return  0;
}
模式规则示例:

all: hello

hello: hello.o
    gcc -o "$@" hello.o
%.o: %.c
    gcc -c $<

.PHONY:clean

clean:
    rm *.o hello

典型的c hello world程序:

你好,c:

#include <stdio.h>

int main() {
  printf("Hello, World!\n");
  return  0;
}
模式规则示例:

all: hello

hello: hello.o
    gcc -o "$@" hello.o
%.o: %.c
    gcc -c $<

.PHONY:clean

clean:
    rm *.o hello
您的makefile提供了一个规则
%:%.c
,指定您感兴趣的是无扩展可执行文件和.c文件(事实上,只有内置规则做了这么多),但没有提示有名为
hello.c
的源文件或名为
hello
的目标文件

当您自己键入
make
时,make会将makefile中列出的第一个目标作为要生成的目标,但是您的makefile不包含任何目标,因此没有目标。停止简言之,make不知道附近有什么名字像
hello*

在makefile保持原样的情况下,键入
makehello
将执行您想要的操作,因为它告诉make您想要构建什么

如果您告诉make关于
hello
,您还可以只键入
make
来执行您想要的操作:

hello: hello.c

%: %.c
或者更惯用、更灵活地说,您可以在
all
目标中列出所有“顶级”目标:

all: hello

%: %.c

.PHONY: all
您的makefile提供了一个规则
%:%.c
,指定您感兴趣的是无扩展可执行文件和.c文件(事实上,只有内置规则做了这么多),但没有提示有名为
hello.c
的源文件或名为
hello
的目标文件

当您自己键入
make
时,make会将makefile中列出的第一个目标作为要生成的目标,但是您的makefile不包含任何目标,因此没有目标。停止简言之,make不知道附近有什么名字像
hello*

在makefile保持原样的情况下,键入
makehello
将执行您想要的操作,因为它告诉make您想要构建什么

如果您告诉make关于
hello
,您还可以只键入
make
来执行您想要的操作:

hello: hello.c

%: %.c
或者更惯用、更灵活地说,您可以在
all
目标中列出所有“顶级”目标:

all: hello

%: %.c

.PHONY: all

您的程序将无法编译,因为
exit()
是在
stdlib.h
中定义的,您甚至不包括它。其次,如果这是您真正需要编译的全部内容,只需键入
makehello
。Gnu make将使用默认的lib、头和编译自动为您构建此文件(尽管如果您在同一文件夹中有
hello.c
hello.cpp
hello.java
这三个文件,可能会产生混淆。)是的,我知道如何通过运行
maketargetname
来制作一个简单的程序,但在这个问题中,我简化了我的原始问题。我想知道为什么编写
%:%.c
规则在这里不起作用?您的程序将无法编译,因为
exit()
stdlib.h
中定义,您甚至不包括它。其次,如果这是您真正需要编译的全部内容,只需键入
makehello
。Gnu make将使用默认的lib、头和编译自动为您构建此文件(尽管如果您在同一文件夹中有
hello.c
hello.cpp
hello.java
这三个文件,可能会产生混淆。)是的,我知道如何通过运行
maketargetname
来制作一个简单的程序,但在这个问题中,我简化了我的原始问题。我想知道为什么写
%:%.c
规则在这里不起作用?嗨@lulyon,谢谢。云你能帮我用自动变量和模式规则来写这个make文件吗?@Khajavi好的。(%.o:%.c\n\t gcc-c$@Khajavi注意分隔符。在我的上可以。你好@lulyon,谢谢。Cloud你能帮我用自动变量和模式规则编写这个make文件吗?@Khajavi好的。(%.o:%.c\n\t gcc-c$@Khajavi注意分隔符。在我的问题上可以。这是对所问问题的最佳答案。这是对所问问题的最佳答案。