0

我正在尝试为项目创建一个名为“p1”的生成文件。

当我尝试make p1它返回的命令时make: nothing to be done for p1

另外,当我尝试make p1 clean它返回的命令时no rule to make p1 'clean.' Stop

这是我的生成文件:

a.out: main.o P1LinkedList.o const_iterator.o iterator.o Node.o
        g++ -std=c++11 main.o const_iterator.o iterator.o Node.o

main.o:
        g++ -std=c++11 -c main.cpp

P1LinkedList.o:
        g++ -std=c++11 -c P1LinkedList.cpp

iterator.o:
        g++ -std=c++11 -c iterator.cpp

const_iterator.o:
        g++ -std=c++11 -c const_iterator.cpp

Node.o:
        g++ -std=c++11 -c Node.cpp

depend:
        g++ -MM main.cpp > p1.dep

clean:
        rm -f a.out *.o

我需要解决什么问题才能让 makefile 从我的 .cpp 文件中编译 .o 文件,以及如何使用 clean 命令解决问题?

编辑:这是我用来手动编译的命令:

Helens-Air:p1a helenade$ g++ -std=c++11 *.cpp
Helens-Air:p1a helenade$ ./a.out

^^ 这只是从那里继续执行程序

4

1 回答 1

0

我们可能需要分阶段进行。

首先,您似乎误解了makefile名称和目标名称之间的区别。这似乎是您和您的老师之间的沟通不畅,但很容易清除。

假设您有一个名为“Makefile”的生成文件,其中包含以下内容:

foo:
    @echo running the foo rule

bar:
    @echo running the bar rule

如果你make foo,你会得到:

running the foo rule

参数 ( foo) 告诉 Make 尝试构建哪个目标。Make 是如何知道要使用哪个 makefile 的?(毕竟,工作目录中可能有十几个 makefile。)您可以指定要使用的 makefile,但如果您不这样做,则默认情况下 Make 将查找名为Makefile(or makefileor ) 的 makefile GNUmakefile,不要担心这个目前)。要指定具有其他名称的 makefile,例如“Buildfile”,您可以使用以下-f标志:

make -f Buildfile

所以“p1”应该是一个目标的名字,而不是一个makefile。在 makefile 中,将您的a.out规则重命名为p1. 然后将整个 makefile 重命名为Makefile. 然后

make p1

应该工作(或至少运行)。

编辑:

我会四处走动。在a.out规则(现在应该称为p1规则)中,我注意到您已将P1LinkedList.o要链接的目标文件列表排除在外。所以尝试改变它:

p1: main.o P1LinkedList.o const_iterator.o iterator.o Node.o
    g++ -std=c++11 main.o P1LinkedList.o const_iterator.o iterator.o Node.o

如果可行,您可以使用自动变量对其进行简化:

p1: main.o P1LinkedList.o const_iterator.o iterator.o Node.o
    g++ -std=c++11 $^

您还可以进行其他一些小的改进。

如果它不起作用,请尝试ls *.cpp查看您是否忽略了其他一些源文件。

于 2020-01-23T01:10:43.267 回答