Macos ';make:p1和'无需执行任何操作;没有制定目标的规则';清洁'';

Macos ';make:p1和'无需执行任何操作;没有制定目标的规则';清洁'';,macos,makefile,terminal,makefile-errors,Macos,Makefile,Terminal,Makefile Errors,我正在尝试为一个项目创建一个名为“p1”的makefile 当我尝试命令make p1时,它返回make:nothing to do for p1 另外,当我尝试命令makep1clean时,它返回no-rule使p1“clean.”Stop 这是我的makefile: a.out: main.o P1LinkedList.o const_iterator.o iterator.o Node.o g++ -std=c++11 main.o const_iterator.o ite

我正在尝试为一个项目创建一个名为“p1”的makefile

当我尝试命令
make p1
时,它返回
make:nothing to do for p1

另外,当我尝试命令
makep1clean
时,它返回
no-rule使p1“clean.”Stop

这是我的makefile:

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

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

我们可能需要分阶段进行

首先,您似乎误解了生成文件名和目标名称之间的区别。这似乎是你和老师之间的沟通失误,但很容易澄清

假设您有一个名为“makefile”的makefile,其中包含以下内容:

foo:
    @echo running the foo rule

bar:
    @echo running the bar rule
如果您
制作foo
,您将获得:

running the foo rule
参数(
foo
)告诉Make尝试构建哪个目标。你是如何知道使用哪个makefile的?(毕竟,工作目录中可能有十几个makefile。)您可以指定要使用的makefile,但如果不指定,默认情况下Make将查找名为
makefile
(或
makefile
GNUmakefile
,暂时不用担心)。要使用另一个名称(如“Buildfile”)指定makefile,可以使用
-f
标志:

make -f Buildfile
所以“p1”应该是一个目标的名称,而不是一个生成文件。在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
如果可行,您可以通过以下方法简化:

你还可以做一些小的改进


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

如果生成文件名为
p1
,则尝试
make-f p1
,而不是
make p1
。如果这样做有效,我们将使问题得到一半的解决。@Beta成功了,但编译器现在给了我错误
“架构x86_64的未定义符号:…”
,最后是
“clang:error:linker命令失败,退出代码为1(使用-v查看调用)”
当我使用
g++-std=c++11手动编译时,我没有得到它。
我的教授还说makefile必须使用命令
makep1
,所以我不能使用
-f
:(您可以显示手动编译时使用的命令吗?我将开始编写答案。我已经发布了我的答案,在您向我显示该命令后,我将对其进行编辑以涵盖其他问题,也许我们会进行另一个或两个实验。
make p1
要工作,您的makefile必须被称为
makefile
,并且在该文件中,必须有一个目标名为
p1
。谢谢你!我认为这解决了我一直遇到的一大部分问题。我发布了手动编译/执行时使用的命令。我将用你的答案对我的makefile进行一些更改,看看它能给我带来什么
p1: main.o P1LinkedList.o const_iterator.o iterator.o Node.o
    g++ -std=c++11 $^