Makefile文件不起作用

Makefile文件不起作用

问题描述:

使用我的生成文件时,我得到这个错误:Makefile文件不起作用

make: Warning: File `makefile' has modification time 56 s in the future 
make: Circular Menu.o <- Menu.o dependency dropped. 
g++ a.out main.o Menu.o CourseList.o Course.o LecturerList.o StudentList.o Lecturer.o Student.o -o a.out 
make: warning: Clock skew detected. Your build may be incomplete. 

这是我的makefile:

a.out: main.o Menu.o CourseList.o Course.o LecturerList.o StudentList.o Lecturer.o Student.o 
g++ main.o Menu.o CourseList.o Course.o LecturerList.o StudentList.o Lecturer.o Student.o -o a.out 

main.o: main.cpp Lecturer.o LecturerList.o Student.o StudentList.o Course.o CourseList.o Menu.o 
g++ -c main.cpp 

Menu.o: Menu.o Lecturer.o LecturerList.o Student.o StudentList.o Course.o CourseList.o 
g++ -c Menu.cpp 

CourseList.o: CourseList.cpp 
g++ -c CourseList.cpp 

Course.o: Course.cpp 
g++ -c Course.cpp 

LecturerList.o: LecturerList.cpp 
g++ -c LecturerList.cpp 

StudentList.o: StudentList.cpp 
g++ -c StudentList.cpp 

Lecturer.o: Lecturer.cpp 
g++ -c Lecturer.cpp 

Student.o: Student.cpp 
g++ -c Student.cpp 

哪里的错误,我该如何解决? 我意识到事实可能会让人困惑,但我希望这里有人能帮助我解决这个问题,我已经打破了我的头几个小时... 谢谢!

注意: 我编辑了错误和makefile。现在,我只有1个问题

第二行:

g++ a.out main.o Menu.o CourseList.o Course.o LecturerList.o StudentList.o Lecturer.o Student.o -o a.out 

试图编译a.outa.out

我想你想

g++ -o a.out ... 

g++ a.out ... 

您也可以通过不Menu.o摆脱圆警告取决于Menu.o

+0

请注意,如果你向右滚动,'-o a.out'已经在命令行上。 – Nick 2012-04-05 15:28:19

+0

对,所以'a.out'应该从行附近开始移除。 – aldo 2012-04-05 15:30:02

+0

好了解决了这个问题并进行了编辑。现在我只有菜单相关的错误,我不知道如何解决。 – Jjang 2012-04-05 15:31:19

线

Menu.o: Menu.o Lecturer.o LecturerList.o Student.o StudentList.o Course.o CourseList.o 

名单Menu.o作为Menu.o的必要条件。

a.out如列出的是输入到g++您应该使用-o来指示您希望输出到那里。

首先,“文件”生成文件“将来修改时间为56秒”的问题是一个系统管理员问题。您正在将文件存储在网络文件系统中。您的计算机和服务器计算机不同意它是什么时间。要解决此问题,请在一台或两台计算机上调整日期,以便他们达成一致。为了保持这个协议,使用诸如“ntpd”之类的东西。

其次,循环依赖是因为您在Makefile中混淆了“.o”和“.cpp”文件。具体而言,您将.o文件列为其他.o文件的源依赖项,这是(几乎)从未如此。 Menu.o: Menu.o就是这样的循环依赖。

第三,“文件a.out未找到”消息是因为您在链接器命令行中指定“a.out”作为输入和输出文件。

这里是你的Makefile的一个固定版本(不要忘记来修复选项卡,如果你复制粘贴到编辑器这个。)

a.out: main.o Menu.o CourseList.o Course.o LecturerList.o StudentList.o Lecturer.o Student.o 
    # Lose extraneous "a.out" on the next line. 
    g++ main.o Menu.o CourseList.o Course.o LecturerList.o StudentList.o Lecturer.o Student.o -o a.out 

# Get rid of all '.o' in the next line. They don't make any sense. 
main.o: main.cpp 
    g++ -c main.cpp 

# Change "Menu.o" to "Menu.cpp" and get rid of other .o files 
Menu.o: Menu.cpp 
    g++ -c Menu.cpp 

CourseList.o: CourseList.cpp 
    g++ -c CourseList.cpp 

Course.o: Course.cpp 
    g++ -c Course.cpp 

LecturerList.o: LecturerList.cpp 
    g++ -c LecturerList.cpp 

StudentList.o: StudentList.cpp 
    g++ -c StudentList.cpp 

Lecturer.o: Lecturer.cpp 
    g++ -c Lecturer.cpp 

Student.o: Student.cpp 
    g++ -c Student.cpp 

最后,你的Makefile可以作出更简单如果使用模式规则和自动变量,则可读性更高。

这里是一个更短的版本:

a.out: main.o Menu.o CourseList.o Course.o LecturerList.o StudentList.o Lecturer.o Student.o 
    g++ $^ -o a.out 

# Take advantage of Makefile's pattern match to avoid specifying every. single. file. 
%.o: %.cpp 
    g++ -c $< 


参考: http://www.gnu.org/software/make/manual/make.html

+1

正如@Nick指出的,现在你在同一行上有两个'-o a.out'事件。 – aldo 2012-04-05 15:31:34

+0

@aldo - 谢谢。我没有注意到那条很长的路线的结束。我在我的编辑中解决了这个问题。 – 2012-04-05 15:44:28

+1

在这种情况下,您甚至可以省略模式规则,因为它已内置到'make'中。 – Idelic 2012-04-05 21:23:25