Makefile 执行过程中出错:make: *** No rule to make target ‘ all ‘,needed by ‘all’.Stop

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;
}

version.h.in

#ifndef HELLO_WORLD_VERSION_H
#define HELLO_WORLD_VERSION_H

#define _VERSION "<version>"

#endif

猜你喜欢

转载自blog.csdn.net/weixin_43820463/article/details/89042059