““ make:*** [executable] Error 1”是什么意思?”

时间:2018-08-27 21:28:07

标签: c++ gcc makefile gnu

我制作了一个makefile来编译程序。我不知道这出了什么问题。

    CPP = gcc
    CXXFLAGS = -I. -std=gnu++2a
    DEPS = Robot.h gene_pool.h generate_matrix.h generate_rand_coordinates.h constants.h
    OBJS = gene_pool.o generate_matrix.o generate_rand_coordinates.o main.o Robot.o

    %.o: %.cpp $(OBJS) $(DEPS)
            $(CPP) -c -o $@ $< $(CXXFLAGS)

    robot: $(OBJS) $(DEPS)
            $(CPP) -o $@ $^ $(CXXFLAGS)

产生的错误消息:

      make: Circular gene_pool.o <- gene_pool.o dependency dropped.
    make: Circular generate_matrix.o <- gene_pool.o dependency dropped.
    make: Circular generate_matrix.o <- generate_matrix.o dependency dropped.
    make: Circular generate_rand_coordinates.o <- gene_pool.o dependency dropped.
    make: Circular generate_rand_coordinates.o <- generate_matrix.o dependency dropped.
    make: Circular generate_rand_coordinates.o <- generate_rand_coordinates.o dependency dropped.
    make: Circular main.o <- gene_pool.o dependency dropped.
    make: Circular main.o <- generate_matrix.o dependency dropped.
    make: Circular main.o <- generate_rand_coordinates.o dependency dropped.
    make: Circular main.o <- main.o dependency dropped.
    make: Circular Robot.o <- gene_pool.o dependency dropped.
    make: Circular Robot.o <- generate_matrix.o dependency dropped.
    make: Circular Robot.o <- generate_rand_coordinates.o dependency dropped.
    make: Circular Robot.o <- main.o dependency dropped.
    make: Circular Robot.o <- Robot.o dependency dropped.
    gcc -o robot gene_pool.o generate_matrix.o generate_rand_coordinates.o main.o Robot.o Robot.h gene_pool.h generate_matrix.h generate_rand_coordinates.h constants.h -I. -std=gnu++2a
    clang: error: cannot specify -o when generating multiple output files
    make: *** [robot] Error 1

我不明白大部分信息。与我的代码有关系吗?

1 个答案:

答案 0 :(得分:0)

让您动起来。

您可以通过删除一些内容来解决此问题:

从此行中删除对象

%.o: %.cpp $(OBJS) $(DEPS)

应该像这样:

%.o: %.cpp         $(DEPS)

否则,每个目标文件都依赖于所有其他目标文件。在这种依赖关系中会出现循环,这就是错误消息所抱怨的。

因此,目标文件取决于其源文件和源文件使用的标头。它不太可能依赖于所有源文件,但不会引起问题(只是它可能会迫使重新编译的次数超出您的意愿)。

在此行中删除DEPS

robot: $(OBJS) $(DEPS)

应如下所示:

robot: $(OBJS)

可执行文件不需要依赖头文件。如果任何目标文件被重建,那么可执行文件将被重建。因此,额外的DEPS不会添加任何内容。

这不是一个完美的Makefile,但它应该适合您的用例。