2015-03-13 5 views
0

Я много читал о том, как писать make-файлы для создания приложения в Linux, но я в большой степени смущен многими различными способами, по-видимому, для достижения той же цели.Правила и зависимости GNU makefile

Это то, к чему я придумал, чтобы построить архив.

SHELL = /bin/sh 

CXX = g++ 
DEBUG = -g 
CXXFLAGS = -std=c++11 -Wall -pedantiC#-Wextra 
CPPFLAGS = -I. \ 
      -I./include 

SOURCES = foo1.cpp \ 
      foo2.cpp \ 
      foo3.cpp 

OBJECTS = $(SOURCES:.cpp=.o) 

следующее правило успешно компилирует каждый исходный файл в объектный файл, а затем создает архив:

libfoo.a: $(OBJECTS) 
    ar rvcs [email protected] $(OBJECTS) 

%.o: src/%.cpp ./include/%.h 
    $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o [email protected] $< 

Это также делает то же самое:

libfoo.a: $(OBJECTS) 
    ar rvcs [email protected] $(OBJECTS) 

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

Однако это не удается с ошибкой, что нет правила для создания цели 'foo1.o:%. h

libfoo.a: $(OBJECTS) 
    ar rvcs [email protected] $(OBJECTS) 

$(OBJECTS) : %.o:src/%.cpp %.o:%.h 
    $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o [email protected] $< 

Может кто-нибудь объяснить, почему он не работает и какой подход лучше?

Первый вариант отображает файлы заголовков в качестве зависимостей, но второй вариант не указан. Это моя мотивация для третьего варианта.

Как указать заголовки в качестве зависимостей с помощью опций 2 или 3?

ТИА

ответ

0

Функция вы используете в Ьгу # 2 и # 3 попробовать это static pattern rules и синтаксис выглядит следующим образом:

<targets...> : <target-pattern> : <prerequisites...> 

Там может быть только два двоеточия, а не три. Вы должны написать попробовать # 3 выше, как:

$(OBJECTS) : %.o : src/%.cpp %.h 
     $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o [email protected] $< 

Примечание одной критической вещи: это правило не сработает, если вы когда-либо создать любой .cpp файл, который делает не имеют ассоциированный .h файл. Просто говорю'.

+0

Спасибо. Итак, это означает, что объекты зависят от% .o, заменяемого как .cpp, так и .h? – ksl

+0

Какой лучший подход? – ksl

+0

В руководстве описывается правило статического шаблона ... если вы его не получите, задайте конкретный вопрос о том, что там сбивает с толку. В основном это говорит «для каждой цели, указанной в' 'создайте явное правило с предпосылками, которые соответствуют шаблонам prereq, где'% 'построено из совпадения цели. В руководстве легче понять (ИМО). – MadScientist