Makefile错误:没有生成目标的规则

12
SOURCES = server.c

TARGET = Server

CC = gcc

all: $(SOURCES) $(TARGET) 


$(CC) $(SOURCES) -o $(TARGET) 

clean:


rm -rf $(TARGET) 

以下是我的网页服务器的Makefile。尽管server.c文件在目录中,但会出现以下错误。

make: *** No rule to make target `Server', needed by `all'.  Stop.

我犯了什么错误,该如何解决?


1
你的 makefile 看起来像上面这样吗?如果不是,请编辑直到两者匹配。如果是,请了解 makefile 语法。 - user2100815
这是我的 Makefile。它导致了上述错误。 - Udara S.S Liyanage
3个回答

17

我认为你的 makefile 在你的机器和发布之间混淆了,但是我认为有一个简单的解决方法:

all: $(SOURCES)

如果这就是你想要的,那么它(很可能)会解决问题并使错误消失 - 如果是这样的话,你可以停止阅读。但是,这个Makefile仍然有一些问题,因此我们可以进行更多改进。

首先,稍作调整以使其符合我认为你的Makefile实际上想表达的意思:

SOURCES = server.c

TARGET = Server

CC = gcc

all: $(SOURCES) $(TARGET)
    $(CC) $(SOURCES) -o $(TARGET) 

clean:
    rm -rf $(TARGET) 

前三行和clean规则都是正确的,我们将忽略它们。现在我们给TARGET赋予自己的规则并澄清先决条件:

all: $(TARGET)

$(TARGET): $(SOURCES)
    $(CC) $(SOURCES) -o $(TARGET) 

现在我们将all标记为PHONY(因为它实际上不会生成名为"all"的文件),并引入自动变量使得TARGET规则更加强大和不冗余:

.PHONY: all
all: $(TARGET)

$(TARGET): $(SOURCES)
    $(CC) $< -o $@ 

如果你的代码库变得更加复杂,还有更多需要学习的地方,但现在就这样吧。


2

只需执行"make clean"命令来清除所有链接,然后再次运行make命令即可。一切应该都会变得很好。


0
我的问题是我把名称和命令放在同一行上。确保你使用的是制表符而不是空格。(无意冒犯)。
之前(错误的)
build: docker build...

之后

build:
        docker build...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接