Pattern Matching Mingw сделать

Я чрезвычайно новичок в Makefiles, и в настоящее время я пытаюсь построить свой первый на проекте, который я начинаю.

У меня проблема в том, что он автоматически знает, как обрабатывать все мои файлы .cpp без определения правил для каждого из них.

Я также хочу, чтобы все мои объектные файлы были помещены в одну папку, которая $(PLATFORM)/obj/ где PLATFORM=win32 в этом случае.

Это то, что я использую для Makefile, выполняя его с помощью mingw32-make.exe

CXX=g++
CXXFLAGS=-c -Wall -DALLEGRO_STATICLINK
LDFLAGS=
PLATFORM=win32
SOURCES=main.cpp
EXECUTABLE=app.exe
OBJDIR=$(PLATFORM)/obj/
OBJECTS= $(SOURCES:%.cpp=$(OBJDIR)%.o)

all: $(EXECUTABLE)

%.o: %.c
$(CXX) $(CXXFLAGS)  $< -o $@$(EXECUTABLE): $(OBJECTS)
$(CXX) $(OBJECTS) $(LDFLAGS) -o $(EXECUTABLE)

Я получаю ошибку:

mingw32-макияж: * Нет правила, чтобы сделать цель win32/obj/main.o', needed by
app.exe ‘. Стоп.

Я не уверен, что делаю не так, я смотрел на другие примеры make-файлов, и они, похоже, имеют похожую структуру, поэтому я не уверен, что не так с моим. Я ищу объяснение, почему это происходит, и совет, как это исправить.
Кроме того, любые комментарии по моему стилю, предложения по его чистоте / стандартизации были бы отличными. Во время обучения созданию make-файлов я хочу убедиться, что я учусь правильно.

Спасибо

0

Решение

make видит, что нужно создать win32/obj/main.o, но не вижу ни одного правила, чтобы сказать ему, как это сделать.

У вас есть три правила, одно для allодин для %.o и один для $(EXECUTABLE), Первый и последний не скажут make как создать win32/obj/main.o,

Второе правило, вероятно, должно, но оно говорит это: если вы хотите создать <something>.o, а затем сначала убедитесь, что есть файл с именем <something>.c (если он не существует, попробуйте найти правило, чтобы сделать это). Затем выполните следующую команду: $(CXX) ...

Но файл <something>.c не существует, потому что ваши файлы заканчиваются .cpp, Так что это правило не выполняется. make не могу найти другое правило для построения win32/obj/main.oтак что сдается.

Таким образом, вам нужно изменить правило так, чтобы %.o зависит от %.cpp, а потом make сможет выполнить команду для создания объектного файла. Таким образом, правило должно быть:

%.o: %.cpp
$(CXX) $(CXXFLAGS)  $< -o $@

Кстати, make также имеет предопределенные неявные правила. Потому что вы даете явное правило для %.o вы на самом деле переопределяете предопределенное правило. Я предлагаю вам в какой-то момент попытаться вообще не давать этого правила (но все же определить CXX а также CXXFLAGS) и посмотрим, что получится. Увидеть этот для деталей.

0

Другие решения

Я не хочу отговаривать вас от использования make-файлов вручную, но если вы хотите полностью устранить проблему, есть доступные автоинструменты, которые сгенерируют make-файлы для вас. Поскольку вы используете Windows, я подозреваю, что вы используете Cygwin (или, возможно, MingGW). Для cygwin просто скачайте двоичный пакет autotools. Если вы используете eclipse для своей IDE (которую я настоятельно рекомендую), вы можете настроить свою среду так, чтобы она включала автоинструменты. Таким образом, вы просто сосредоточены на написании кода. Все параметры конфигурации все еще существуют, но вам не обязательно знать, что делать.

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector