Makefile 执行过程中出错:make: *** No rule to make target ‘ all ‘,needed by ‘all’.Stop
Makefile文件
OBJECTS = main.o
TARGET = hello
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) -o $@ $^
main.o: main.c version.h
version.h: new_header
clean:
rm -f $(TARGET) $(OBJECTS) version.h
.PHONY: all clean
所在文件夹包括文件main.c version.h
改正
折腾半天才发现错误,解决方法:
将第二行最后空格,并与第三行空一行
原因
这是make的语法错误,具体语法可以参见:
[CSDN博客] https://blog.csdn.net/u013216061/article/details/70592461
警戒
在自己编写Makefile文件时,不要随意空行,空格。虽然我们自己编写Makefile的机会很少,但一定要求自己有好惯
总结
如果Makefile出现:
make: *** No rule to make target ` ‘, needed by xxx. Stop.
的错误,那么基本上都是属于找不到所依赖的文件所导致的,所以首先应该
检测确保,所依赖的文件,是否真实存在。
但是很可能,很常见的一个现象就是,在此处,写了多余的空格或空行 make时,误以为依赖文件,导致找不到该文件,提示如此错误。
解决办法就很简单,去掉多余的空格即可。
如果使用九牛二虎之力看不出来的话,重写也是一个不错的选择哦!
附改正后的文件
OBJECTS = main.o
TARGET = hello
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) -o $@ $^
main.o: main.c version.h
version.h: new_header
new_header:
@sed -e "s/<version>/$$(git describe) /g" \
< version.h.in > version.h.tmp
@if diff -q version.h.tmp version.h >/dev/null 2>&1; \
then \
rm version.h.tmp; \
else \
echo "version.h.in => version.h" ; \
mv version.h.tmp version.h; \
fi
clean:
rm -f $(TARGET) $(OBJECTS) version.h
.PHONY: all clean
main.c
#include <stdio.h>
#include "version.h"
int main()
{
printf("hello,world!\n);
printf("version: %s.\n", _VERSION);
return 0;
}
#ifndef HELLO_WORLD_VERSION_H
#define HELLO_WORLD_VERSION_H
#define _VERSION "<version>"
#endif