2015-04-04 3 views
1

и спасибо за ваше время. У меня есть следующие Makefile:Сделайте объекты в Makefile

CXX  = g++ 
CXXFLAGS = -Wall -g 
SOURCES := divisor.cpp multiplier.cpp 
OBJECTS := ${SOURCES:.cpp=.o} 

%.o: %.cpp 
     $(CXX) -c $(CXXFLAGS) $< -o [email protected] 

%: %.o $(OBJECTS) 
     $(CXX) $(CXXFLAGS) [email protected] -o [email protected] 

$(OBJECTS): %.o: %.cpp 
     $(CXX) -c $(CXXFLAGS) $< -o [email protected] 
clean: 
     rm -f *.o 

То, что я хочу это сделать файл является следующее: Если добавить исходный файл с именем 123.cpp в рабочий каталог, я хочу, чтобы сгенерировать свой объектный файл, а затем связать скомпилированный источники, указанные в $(SOURCES), это означает:

g++ -c -Wall -g 123.cpp 
g++ multipler.o divisor.o 123.o -o 123 

Если multiplier.cpp или divisor.cpp должен быть создан или обновлен, я хочу сделать, чтобы сделать это.

Но я не удается, потому что divisor.o и multiplier.o не создаются автоматически

Как я могу добиться этого?

Редактировать

Просто чтобы прояснить, есть два типа файлов исходного кода в рабочем каталоге: divisor.cpp, multipler.cpp является один тип, и любой другой файл, скажем, 123.cpp является другой тип. В некотором смысле, divisor.cpp и multiplier.cpp являются реквизитами для других исходных файлов.

Я хочу, чтобы автоматизировать процесс составления необходимых условий и связать их при компиляции других файлов

g++ -c multiplier.cpp 
g++ -c divisor.cpp 
g++ -c -Wall -g 123.cpp 
g++ multipler.o divisor.o 123.o -o 123 
+1

Во-первых, у вас нет правила в зависимости от '' $ (SOURCES) '' на месте. Вам нужно что-то похожее на то, что вы делали с '' $ (OBJECTS) '' – BitTickler

+1

Вы не указали конечную цель в зависимости от '$ (OBJECTS)'? –

+0

Не соответствует ли целевой '$ (ОБЪЕКТЫ)' как правило для '$ (SOURCES)' неявно? Конечная цель в зависимости от '$ (OBJECTS)' не '%:%. O $ (OBJECTS)'? Спасибо и – Jorge

ответ

1

Используйте wildcard функцию:

SOURCES := $(wildcard *.cpp) 

Затем, вы можете удалить ваш «специальный» исходные файлы:

SPECIAL_SOURCES := divisor.cpp multiplier.cpp 
SOURCES := $(filter-out $(SPECIAL_SOURCES),$(SOURCES)) 

И измените свои правила на создание материал, который вы на самом деле хотите:

$(SPECIAL_OBJECTS) := $(SPECIAL_SOURCES:.cpp=.o) 
$(BINARIES) := $(patsubst .cpp,,$(SOURCES)) 

$(SPECIAL_OBJECTS) : %.o : %.cpp 
    $(CXX) $(CXXFLAGS) -c -o [email protected] $^ 

$(BINARIES) : % : %.cpp $(SPECIAL_OBJECTS) 
    $(CXX) $(CXXFLAGS) -o [email protected] $^ 
+0

Спасибо и посмотрим, пожалуйста, отредактируйте. – Jorge

+0

@Jorge - отредактирован для удовлетворения желаемого поведения. –

+0

Спасибо, я пытаюсь как можно скорее :) – Jorge

Смежные вопросы