Я много читал о том, как писать 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?
ТИА
Спасибо. Итак, это означает, что объекты зависят от% .o, заменяемого как .cpp, так и .h? – ksl
Какой лучший подход? – ksl
В руководстве описывается правило статического шаблона ... если вы его не получите, задайте конкретный вопрос о том, что там сбивает с толку. В основном это говорит «для каждой цели, указанной в' 'создайте явное правило с предпосылками, которые соответствуют шаблонам prereq, где'% 'построено из совпадения цели. В руководстве легче понять (ИМО). –
MadScientist