Macos ';make:p1和'无需执行任何操作;没有制定目标的规则';清洁'';
我正在尝试为一个项目创建一个名为“p1”的makefile 当我尝试命令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
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 $^