【问题标题】:No rule to make target 'main.o', needed by 'out'. Stop没有规则可以使“out”需要目标“main.o”。停止
【发布时间】:2021-12-20 10:49:34
【问题描述】:

我不断收到此错误,但我无法弄清楚我做错了什么。我正在使用一个模板,所以我可以在 dir bin 中获取可执行文件。目录包括头文件。创建的目标文件的 dir obj 和 .c 文件的 src。

我的生成文件

OBJ_dir = obj
INC_DIR = include
OBJECTS = main.o client.o private.o memory.o process.o proxy.o server.o
main.o = main.h memory-private.h stdio.h stdlib.h string.h syscall.h unistd.h wait.h sysexits.h memory.h 
client.o = client.h
private.o = private.h
memory.o = memory.h memory_private.h
process.o = process.h
proxy.o = proxy.h
server.o = server.h
CC = gcc
CFLAGS = -Wall –I $(INC_DIR)
LIBS = -lm

out: $(OBJECTS)
    $(CC) $(addprefix $(OBJ_dir)/,$(OBJECTS)) -o bin/out $(LIBS)

%.o: src/%.c $($@)
    $(CC) $(CFLAGS) -o $(OBJ_dir)/$@ -c $<

clean:
    rm –f *.o out
    rm –f out

【问题讨论】:

  • main.o = = 必须是 : 以及其他依赖规则。

标签: c makefile


【解决方案1】:

这里有很多问题。至少阅读 the GNU make manual 的前几章以了解 make 和 makefile 的工作原理可能是个好主意。

遵循这条规则:

out: $(OBJECTS)
        $(CC) $(addprefix $(OBJ_dir)/,$(OBJECTS)) -o bin/out $(LIBS)

首先,列出与您实际构建的文件不同的目标是不对的。在这里,您告诉 make 您将构建一个名为 out 的目标,但您的配方实际上构建了一个名为 bin/out 的目标。错了。

其次,但同样地,让您的目标依赖于一组先决条件($(OBJECTS) 定义的文件)然后让您的规则配方使用一组完全不同的先决条件(通过添加 @ 987654326@ 所有文件的前缀)。

这告诉 make“请构建文件 main.oclient.o 等,但我的命令实际使用的是文件 obj/main.oobj/client.o 等”。告诉 make 构建你不会实际使用的目标是没有意义的。

这应该是:

bin/out: $(addprefix $(OBJ_dir)/,$(OBJECTS))
        $(CC) $^ -o $@ $(LIBS)

一般来说,如果您发现自己编写了一个配方,其中修改了 $@$^ 等自动变量,而不是按原样使用它们,那么您几乎肯定做错了什么。

接下来你的模式规则还有其他问题:

%.o: src/%.c $($@)
        $(CC) $(CFLAGS) -o $(OBJ_dir)/$@ -c $<

首先,您不能在先决条件列表中使用像$@ 这样的自动变量。这些值仅在扩展规则的recipe 时设置。在评估先决条件列表时,它们没有设置(空)。所以$($@)在这里展开为空字符串,什么也不做。

其次,您遇到与上述相同的问题,您没有创建$@,而是创建了$(OBJ_dir)/$@,这是错误的。你应该这样写你的规则:

$(OBJ_dir)/%.o: src/%.c
        $(CC) $(CFLAGS) -o $@ -c $<

以便目标列出您要构建的文件,并且配方使用$@ 而无需修改。

至于您的先决条件,您应该直接创建它们,而不是尝试使用花哨的变量(这是行不通的)。正如上面的评论所暗示的,只需改变:

proxy.o = proxy.h

到:

proxy.o : proxy.h

(以及所有其他)它会起作用。但是请注意,make 总是构建它默认看到的第一个显式目标,因此如果您希望 bin/out 成为默认目标,您可能需要稍微重新安排您的 makefile。

【讨论】:

    猜你喜欢
    • 2021-05-12
    • 2023-02-25
    • 2014-06-07
    • 2012-02-14
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多