为什么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注意分隔符。在我的问题上可以。这是对所问问题的最佳答案。这是对所问问题的最佳答案。