Ошибки Makefile, когда я меняю имя каталога - PullRequest
0 голосов
/ 15 марта 2012

У меня есть Makefile, который компилируется, но я хочу изменить имя одного из каталогов с «release» на «objects».Это оригинальный Makefile -

# This makefile compiles ....

INCLUDE = -I/usr/include/X11 -I/usr/local/include -I/usr/local/include/FL/images -I/usr/include/freetype2

CC=g++ 
CFLAGS=-w -D LINUX -O3 -fpermissive 
OBJDIR=release  # HERE IS THE DIRECTORY I WANT TO CHANGE
SRCDIR=src

LDFLAGS= -L/usr/X11R6/lib$(LIBSELECT) -lpthread -lfltk -lXext -lXft -lfontconfig -lXinerama -lpthread -ldl -lm -lX11

SOURCES_RAW= robot_driver_agent.cpp robot_driver_position.cpp robot_driver_priorityqueue.cpp main.cpp robot_driver_tree.cpp robot_driver_stack.cpp robot_driver_grid.cpp robot_driver_path.cpp grid_analyzer.cpp tcpserver.cpp tcpclient.cpp servercontrol.cpp clientcontrol.cpp robot.cpp udpserver.cpp udpclient.cpp owncontrol.cpp guiwindow.cpp rs232.cpp

TARGET:= go
TARGETD:= go_d

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

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

all: $(TARGET)

$(TARGET): $(OBJECTS)
    $(CC) -w -D LINUX $(INCLUDE) $^ -o $@ $(LDFLAGS)

release/%.o: src/%.cpp
    test -d $(OBJDIR) || mkdir $(OBJDIR)
    $(CC) -g -c $< $(CFLAGS) -o $@ 

debug: $(TARGETD)

$(TARGETD): $(OBJECTS)
    $(CC) -w -D LINUX $(INCLUDE) $^ -o $@ $(LDFLAGS)

%.o: $(SRCDIR)/%.cpp
    $(CC) -c -g $< $(CFLAGS)-o $@



.PHONY : clean
clean:
    rm -f $(OBJDIR)/*.o
    rm -f $(TARGET) $(TARGETD)

Все, что я делаю, это заменяю символ OBJDIR на "объекты", так что это будет просто -

OBJDIR=objects

Но когда я это делаю,ошибка -

make: *** No rule to make target `objects/robot_driver_agent.o', needed by `go'.

Чего мне не хватает?Является ли «объекты» словом, зарезервированным для чего-то в make, поэтому я не могу использовать его для каталогов?Что-то в файле make нужно изменить?Честно говоря, я не так много знаю о make-файлах, поэтому любая помощь будет очень полезна.Благодаря.

1 Ответ

0 голосов
/ 15 марта 2012

У вас есть правило:

release/%.o: src/%.cpp
    ...

Так что, когда OBJDIR=release и Make хочет собрать release/robot_driver_agent.o, он знает, что делать. Затем вы пытаетесь OBJDIR=objects, он хочет построить objects/robot_driver_agent.o, и он не знает как, потому что нет подходящего правила. Попробуйте изменить правило на:

$(OBJDIR)/%.o: src/%.cpp
    ...
...