2013-03-15 135 views
0

我在Xcode中編寫了這個C++項目,現在我必須創建一個Makefile以便它能夠正確編譯。這裏是Makefile中:在使用Xcode編寫的C++項目時遇到問題

CC = g++ 
CFLAGS = 

PROG = TrainStation 
MAIN = main.cpp 
OBJS = ArrivalEvent.o DepartureEvent.o Event.o EventCoordinator.o InSwitchEvent.o ListItem.o OrderedList.o OutSwitchEvent.o PriorityQueue.o Train.o 

# compiling rules 

# WARNING: *must* have a tab before each definition 
$(PROG): $(OBJS) main.o # The error was leaving out main.o from this line 
    $(CC) $(CFLAGS) $(OBJS) main.o -o $(PROG) 

ArrivalEvent.o: ArrivalEvent.cpp ArrivalEvent.h EventCoordinator.h InSwitchEvent.h Event.h EventCoordinator.h Train.h 
    $(CC) $(CFLAGS) -c ArrivalEvent.cpp -o ArrivalEvent.o 

DepartureEvent.o: DepartureEvent.cpp DepartureEvent.h OutSwitchEvent.h Event.h EventCoordinator.h Train.h 
    $(CC) $(CFLAGS) -c DepartureEvent.cpp -o DepartureEvent.o 

Event.o: Event.cpp Event.h EventCoordinator.h ListItem.h 
    $(CC) $(CFLAGS) -c Event.cpp -o Event.o 

EventCoordinator.o: EventCoordinator.cpp EventCoordinator.h OrderedList.h Event.h Train.h PriorityQueue.h ArrivalEvent.h InSwitchEvent.h 
    $(CC) $(CFLAGS) -c EventCoordinator.cpp -o EventCoordinator.o 

InSwitchEvent.o: InSwitchEvent.cpp InSwitchEvent.h DepartureEvent.h Event.h EventCoordinator.h Train.h 
    $(CC) $(CFLAGS) -c InSwitchEvent.cpp -o InSwitchEvent.o 

ListItem.o: ListItem.cpp ListItem.h 
    $(CC) $(CFLAGS) -c ListItem.cpp -o ListItem.o 

OrderedList.o: OrderedList.cpp OrderedList.h ListItem.h 
    $(CC) $(CFLAGS) -c OrderedList.cpp -o OrderedList.o 

OutSwitchEvent.o: OutSwitchEvent.cpp OutSwitchEvent.h Train.h InSwitchEvent.h Event.h EventCoordinator.h 
    $(CC) $(CFLAGS) -c OutSwitchEvent.cpp -o OutSwitchEvent.o 

PriorityQueue.o: PriorityQueue.cpp PriorityQueue.h OrderedList.h 
    $(CC) $(CFLAGS) -c PriorityQueue.cpp -o PriorityQueue.o 

Train.o: Train.cpp Train.h ListItem.h 
    $(CC) $(CFLAGS) -c Train.cpp -o Train.o 

main.o: $(MAIN) Train.h OrderedList.h PriorityQueue.h EventCoordinator.h 
    $(CC) $(CFLAGS) -c $(MAIN) -o main.o 

clean: 
    rm -f $(PROG) $(OBJS) 

我以前寫的Makefile,但從來沒有一個有這麼多的文件來協調,這似乎是跳躍的main.o規則[編輯:我更新了我的Makefile,但現在收到此不同的錯誤]

$ make 
g++ -c ArrivalEvent.cpp -o ArrivalEvent.o 
g++ -c DepartureEvent.cpp -o DepartureEvent.o 
g++ -c Event.cpp -o Event.o 
g++ -c EventCoordinator.cpp -o EventCoordinator.o 
g++ -c InSwitchEvent.cpp -o InSwitchEvent.o 
g++ -c ListItem.cpp -o ListItem.o 
g++ -c OrderedList.cpp -o OrderedList.o 
g++ -c OutSwitchEvent.cpp -o OutSwitchEvent.o 
g++ -c PriorityQueue.cpp -o PriorityQueue.o 
g++ -c Train.cpp -o Train.o 
g++ main.o ArrivalEvent.o DepartureEvent.o Event.o EventCoordinator.o InSwitchEvent.o ListItem.o OrderedList.o OutSwitchEvent.o PriorityQueue.o Train.o -o TrainStation 
i686-apple-darwin11-llvm-g++-4.2: main.o: No such file or directory 
make: *** [TrainStation] Error 1 

我知道這是G ++一個錯誤,它可能有我的地方,留下了一個文件,或不將兩者聯繫起來做,但我似乎無法找出什麼出錯了。也許有人用清新的眼睛可以發現問題?

編輯:問題解決

我的問題是,$(OBJS)不含main.o,所以$(PROG)規則不依賴於main.o可言。一旦我將main.o添加到$(PROG)的規則中,則main.o的規則會正確執行。

+0

grep的爲其中'_main'被定義,並檢查是否是包含上述 – 2013-03-15 14:10:47

+0

'main.o'沒有被連接時,由於它也沒有編譯,但這是次要的。 – 2013-03-15 14:12:19

+0

_main在任何地方都不是由我定義的。我很確定這是一些內部編譯器的東西。 – MichaelThiessen 2013-03-15 14:18:10

回答

2

MAIN = main.cpp之後,您從不使用此變量編譯和鏈接main.cpp文件。

更改此:

$(CC) $(CFLAGS) $(OBJS) -o $(PROG) 

這樣:

$(CC) $(CFLAGS) $(OBJS) main.o -o $(PROG) 
+0

我這樣做,但現在我得到另一個錯誤。在執行Train.o的規則後,它跳轉到第一條規則,然後說main.o不存在。 它似乎完全忽略了main.o – MichaelThiessen 2013-03-15 14:19:16

+0

@MichaelThiessen的規則,你爲什麼不讓XCode爲你創建Makefile? – Shoe 2013-03-15 14:20:40

+0

Xcode不導出Makefiles。 – MichaelThiessen 2013-03-15 14:26:49

相關問題