首页 > 解决方案 > ““make: *** [executable] Error 1”是什么意思?

问题描述

我制作了一个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

我不明白大部分的消息。它与我的代码有什么关系吗?

标签: c++gccmakefilegnu

解决方案


让你动起来。

你可以通过删除一些东西来解决这个问题:

从此行中删除 OBJES

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

应该看起来像:

%.o: %.cpp         $(DEPS)

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

所以一个目标文件依赖于它的源文件和源文件使用的头文件。它不太可能取决于所有源文件,但它不应该引起问题(只是它可能会比你想要的更频繁地强制重新编译)。

从此行中删除 DEPS

robot: $(OBJS) $(DEPS)

应该是这样的:

robot: $(OBJS)

可执行文件不需要依赖于头文件。如果重新构建任何目标文件,则将重新构建可执行文件。所以额外的 DEPS 不会增加任何东西。

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


推荐阅读