我写了下面的makefile:
hw2p1: hw2p1_main.o hw2p1_getit.o hw2p1_parseit.o hw2p1_moveit.o hw2p1_showit.o
gcc hw2p1_main.o hw2p1_getit.o hw2p1_parseit.o hw2p1_moveit.o hw2p1_showit.o
hw2p1_main.o: hw2p1_main.c
gcc -c hw2p1_main.c
hw2p1_getit.o: hw2p1_getit.c
gcc -c hw2p1_getit.c
hw2p1_parseit.o: hw2p1_parseit.c
gcc -c hw2p1_parseit.c
hw2p1_moveit.o: hw2p1_moveit.c
gcc -c hw2p1_moveit.c
hw2p1_showit.o: hw2p1_showit.c
gcc -c hw2p1_showit.c
我第一次尝试调用make时出现错误:“make:致命错误:看到意外的行结束”我删除了目标之间的空白行并再次调用make,但这次我得到了''ake:致命错误:不知道如何制作hw2p1_main.c“
我已经单独编译了所有这些文件,然后将它们链接起来,所以我知道错误是由于错误的makefile导致的,而不是我的c文件中的错误导致的。
这是我写过的第一个makefile,所以我可能只是完全错误地做了。无论哪种方式,有关如何摆脱这些错误的任何建议?
答案 0 :(得分:1)
当目录无意中不应该是目录时,会发生这种情况,因此看起来hw2p1_main.c
缺少要求规则来创建C源文件。
它也可能是文件名拼写错误。
答案 1 :(得分:1)
你似乎在链接命令中缺少-o,虽然这可能不是你脑海中的想法。直接的抱怨是make无法找到.c文件。当然它在当前的工作目录中?
答案 2 :(得分:0)
首先,尝试一个只编译一件事的makefile:
hw2p1_moveit.o: hw2p1_moveit.c
gcc -o moveit.o -c hw2p1_moveit.c
另外,请确保第2行使用TAB字符,而不是空格。 (我必须在我的编辑器中手动设置它,因为空格是唯一明智的方法:)
答案 3 :(得分:0)
你的Makefile比它需要的更复杂。让我们使用它的隐含规则。它知道如何从foo.c制作foo.o,你不需要告诉它。您的整个Makefile可以简化为:
OBJS = hw2p1_main.o hw2p1_getit.o hw2p1_parseit.o hw2p1_moveit.o hw2p1_showit.o hw2p1: $(OBJS) $(CC) $(CFLAGS) $(CPPFLAGS) $(OBJS) -o $@
正如其他人所说 - 确保使用缩进的实际制表符。 Make非常挑剔。
答案 4 :(得分:0)
只是在黑暗中刺,但文件名的大小写匹配?来自windows / apple世界,有些人对unix文件名区分大小写感到惊讶。
您可以通过从错误输出中精确复制文件名并尝试列出它来检查,即ls -l <paste>
。这也应该告诉你文件名中是否嵌入了一些控制字符,这也可能是你的问题。
答案 5 :(得分:0)
这个答案几乎从来没有!好的,基本上我找到了解决方案。你写的makefile是合理的。但是,您必须在EMACS中创建它。对不对?我有一份提交截止日期并在记事本中写了我的makefile并将其上传到大学服务器上,它从未运行过!我尝试使用不同的代码变体,没有运气。然后我沮丧地在EMACS中重新整理了整个事情,它只是奏效了。没有修改代码。试一试!
答案 6 :(得分:0)
如果你确定
1)它所说的所有文件都丢失在与makefile相同的目录中,或者按照指示的路径显示
2)所有命令行都包含制表符而不是空格(最简单的方法是在第一个字符处按左箭头键,它应该返回原位(行位置的第0个字符)
然后大多数时候问题是Makefile的文件格式 如果您在具有PC(CR / LF)行格式的编辑器中键入文件,则必须将其设置为CR文件格式。
因此,您可以在vi或emacs或任何其他具有UNIX默认文件格式的编辑器中键入Makefile,如果允许设置,则可以在编辑器中将文档文件格式设置为UNIX类型。
这必须适用于所有类型的错误
'ake:致命错误:不知道如何制作目标(OR) <BR/>
'ake: Fatal error: Don't know how to make target
(lastfilename in line)
希望这有帮助。