Я получил следующую ошибку:
Make: *** No rule to make target cardemo.o, needed by cardemo.exe. Stop
Пытаюсь сделать этот makefile
#Makefile for djgpp
#ALLEG =-lalleg
CC =gcc
OBJECTS = cardemo.o
all: cardemo.exe
#executables
cardemo.exe:$(OBJECTS)
$(CC) $(OBJECTS) $(ALLEG) -o $@
clean:
del *.o
del cardemo.exe
Это мой первый опыт создания make-файла с помощью учебных пособий и шаблонов от Google всего несколько дней назад, так что извините меня, если вы найдете другие ошибки, спасибо.
CristiFati Да, я знаю.
Проблема в том, что вы поставили $(OBJECTS) в месте зависимостей, что означает, что makefile должен будет сначала создать этот файл (если он не существует), поэтому вы должны добавить правило для создания objs из файла c следующим образом:
%.o: %.c
$(CC) -o $@ -c $<
$@ означает имя цели, $< означает первую зависимость (вы также можете использовать $^ здесь, $^ означает все зависимости).
Вам не нужно добавлять это правило. Make имеет встроенное правило, которое знает, как это сделать, если у вас нет особых требований.
Согласно [GNU]: Каталог встроенных правил:
Компиляция программ на C n.o производится автоматически из n.c по рецепту вида $(CC) $(CPPFLAGS) $(CFLAGS) -c.
Пример:
Картадемо.с:
int main()
{
return 0;
}
Makefile:
#Makefile for djgpp
#ALLEG = -lalleg
#CC = gcc
OBJECTS = cardemo.o
all: cardemo.exe
#executables
cardemo.exe: $(OBJECTS)
$(CC) $(OBJECTS) $(ALLEG) -o $@
clean:
del *.o
del cardemo.exe
Выход:
(qaic-env) [cfati@cfati-5510-0:/mnt/e/Work/Dev/StackOverflow/q075071635]> ~/sopr.sh ### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ### [064bit prompt]> ls Makefile cardemo.c [064bit prompt]> make cc -c -o cardemo.o cardemo.c cc cardemo.o -o cardemo.exe [064bit prompt]> ls Makefile cardemo.c cardemo.exe cardemo.o
Все прошло нормально, поэтому единственный логический вывод, который можно сделать, это то, что у вас нет файла с именем cardemo.c в той же директории. Если вы измените строку, связанную с ОБЪЕКТАМИ (на OBJECTS = cardemo_notexist.o), вы получите ту же ошибку.
Чтобы обойти это, либо:
Переименуйте исходный файл из любого имени (может быть, это carddemo.c ?) в cardemo.c
Примечание: как упоминалось в комментарии @Mopower, оригиналом был Cardemo.c.
Переименуйте имя объекта, чтобы оно имело имя основы исходного файла: OBJECTS = sourcefile_name.o
Если переименование любого из двух вышеперечисленных элементов невозможно (или, возможно, файл cardemo.c находится в другом каталоге), добавьте правило компиляции, которое будет собирать файл cardemo.o из исходного_файла_name.c:
cardemo.o: sourcefile_name.c $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
Я переименовал исходный файл, он был Cardemo.c вместо cardemo.c Спасибо, у меня больше нет ошибки, связанной с правилом.
У вас есть файл с именем cardemo.c в том же каталоге, что и Makefile? Или лучше: поделитесь, пожалуйста, названием вашего исходного файла(ов).