2011-11-30 45 views
0

我的Makefile中不斷告訴我使用.cpp和.c?

make: *** No rule to make target `rs232.c', 

我列出文件在這裏(rs232.c是在最後) -

SOURCES_RAW=codeprofiler.cpp gametimer.cpp timer.cpp timeprofile.cpp vector4.cpp matrix.cpp agent.cpp agentcontroller.cpp dummy.cpp evader.cpp pursuer.cpp goal.cpp player.cpp graphdata.cpp graph.cpp cubiccoefs.cpp segment.cpp trajectory.cpp anode.cpp arrayvector4.cpp color.cpp drawcomponent.cpp drawcontroller.cpp flags.cpp global.cpp map_analyzer.cpp minheap.cpp node.cpp quadtree.cpp queue.cpp results.cpp sensor.cpp settings.cpp utility.cpp world.cpp gui.cpp main.cpp logger.cpp parameters.cpp counter.cpp polygon.cpp line.cpp robot_driver_agent.cpp position.cpp robot_driver_priorityqueue.cpp main.cpp robot_driver_tree.cpp robot_driver_grid.cpp path.cpp tcpserver.cpp tcpclient.cpp servercontrol.cpp clientcontrol.cpp Robot.cpp udpserver.cpp udpclient.cpp rs232.c 

存在的所有文件都是一個名爲src文件夾中。所以我願意 -

SRCDIR= src 
SOURCES:=$(SOURCES_RAW) 
SOURCES:=$(patsubst %.c, $(SRCDIR)/%.c, $(SOURCES)) 
SOURCES:=$(patsubst %.cpp, $(SRCDIR)/%.cpp, $(SOURCES)) 

爲什麼它不編譯.c文件?

整個的Makefile -

INCLUDE = -I/usr/X11R6/include 
#INCLUDE_W32 = -Isrc 
CC=g++ 
CFLAGS=-w -D LINUX -fpermissive 
CFLAGS_R= -w -D LINUX -O3 -fpermissive 
CFLAGS_D=-w -D LINUX -fpermissive 
OBJ= obj 
OBJ_DEBUG= obj_debug 
OBJDIR= release 
SRCDIR= src 

LDFLAGS= -L/usr/X11R6/lib$(LIBSELECT) -lGL -lfltk -lfltk_gl -lXext -lX11 -lglut -lGLU -lfltk_images 

SOURCES_RAW=codeprofiler.cpp gametimer.cpp timer.cpp timeprofile.cpp vector4.cpp matrix.cpp agent.cpp agentcontroller.cpp dummy.cpp evader.cpp pursuer.cpp goal.cpp player.cpp graphdata.cpp graph.cpp cubiccoefs.cpp segment.cpp trajectory.cpp anode.cpp arrayvector4.cpp color.cpp drawcomponent.cpp drawcontroller.cpp flags.cpp global.cpp map_analyzer.cpp minheap.cpp node.cpp quadtree.cpp queue.cpp results.cpp sensor.cpp settings.cpp utility.cpp world.cpp gui.cpp main.cpp logger.cpp parameters.cpp counter.cpp polygon.cpp line.cpp robot_driver_agent.cpp position.cpp robot_driver_priorityqueue.cpp main.cpp robot_driver_tree.cpp robot_driver_grid.cpp path.cpp tcpserver.cpp tcpclient.cpp servercontrol.cpp clientcontrol.cpp Robot.cpp udpserver.cpp udpclient.cpp rs232.c 

TARGET:= pursuit_evasion 
TARGETD:= pursuit_evasion_d 
TARGETP:= pursuit_evasion_p 
TARGETW32:= pursuit_evasion_w32 

OBJECTS:=$(SOURCES_RAW:.cpp=.o) 
OBJECTS:=$(patsubst %.o,$(OBJDIR)/%.o, $(OBJECTS)) 

SOURCES:=$(SOURCES_RAW) 
SOURCES:=$(patsubst %.cpp, $(SRCDIR)/%.cpp, $(SOURCES)) 

OBJ_DEBUG:=$(SOURCES_RAW:.cpp=.o) 
OBJ_DEBUG:=$(patsubst %.o,debug/%.o, $(OBJ_DEBUG)) 

OBJECTS_P:=$(SOURCES_RAW:.cpp=.o) 
OBJECTS_P:=$(patsubst %.o,profile/%.o, $(OBJECTS_P)) 

OBJDIR=obj 

all: $(TARGET) 

#--- Release 
$(TARGET): $(OBJECTS) 
    $(CC) -w -D LINUX $(INCLUDE) $^ -o [email protected] $(LDFLAGS) 

release/%.o: src/%.cpp 
    $(CC) -c $< $(CFLAGS_R) -o [email protected] 

#--- Debug 
debug: $(TARGETD) 

$(TARGETD): $(OBJ_DEBUG) 
    $(CC) -w -D LINUX $(INCLUDE) $^ -o [email protected] $(LDFLAGS) 

debug/%.o: src/%.cpp 
    $(CC) -c -g $< $(CFLAGS)-o [email protected] 

#-- Profile 
profile: $(TARGETP) 

$(TARGETP): $(OBJECTS_P) 
    $(CC) -w -g -pg -D LINUX $(INCLUDE) $^ -o [email protected] $(LDFLAGS) 

profile/%.o: src/%.cpp 
    $(CC) -c -g -pg $< $(CFLAGS)-o [email protected] 

win32: $(TARGETW32) 

$(TARGETW32): $(OBJECTS) 
    $(CC) -w -D WIN32 $(INCLUDE_W32) $^ -o [email protected] $(LDFLAGS) 

.PHONY : clean 
clean: 
    rm -f release/*.o 
    rm -f debug/*.o 
    rm -f profile/*.o 
    rm -f $(TARGET) $(TARGETD) $(TARGETP) 
+2

你應該表現出你的規則給我們,我想。 – Beginner

+0

你有規則將.c文件編譯成對象嗎? –

+0

如果您列出rs232.o作爲您的目標的先決條件,那麼請推斷它需要使用C編譯器編譯rs232.c。 – lhf

回答

2

您先前的所有文件(rs232.c之前)實際上是C++的文件。

我想你有一個規則來編譯C++文件,稍後在你的makefile中,但你是否也有一個規則來編譯純C文件?

像:

%.o: %.c 
    gcc [...] 

編輯 - 只爲了你知道

你不能強迫指定所有要編譯的文件。

看看foreachdir的功能。
由此,您可以從目錄中獲取與特定模式匹配的所有文件。

例子:

FILES = $(foreach dir,$(DIR_SRC),$(wildcard $(DIR_SRC)*.cpp))