Makefile: нет правила для создания цели "%.o", необходимого для "%". Останавливаться

Я получил следующую ошибку:

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 всего несколько дней назад, так что извините меня, если вы найдете другие ошибки, спасибо.

У вас есть файл с именем cardemo.c в том же каталоге, что и Makefile? Или лучше: поделитесь, пожалуйста, названием вашего исходного файла(ов).

CristiFati 10.01.2023 15:52

CristiFati Да, я знаю.

Mopower 10.01.2023 16:43
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел "Заголовок" в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
1
2
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема в том, что вы поставили $(OBJECTS) в месте зависимостей, что означает, что makefile должен будет сначала создать этот файл (если он не существует), поэтому вы должны добавить правило для создания objs из файла c следующим образом:

%.o: %.c
    $(CC) -o $@ -c $<

$@ означает имя цели, $< означает первую зависимость (вы также можете использовать $^ здесь, $^ означает все зависимости).

Вам не нужно добавлять это правило. Make имеет встроенное правило, которое знает, как это сделать, если у вас нет особых требований.

MadScientist 10.01.2023 19:30
Ответ принят как подходящий

Согласно [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), вы получите ту же ошибку.

Чтобы обойти это, либо:

  1. Переименуйте исходный файл из любого имени (может быть, это carddemo.c ?) в cardemo.c

    Примечание: как упоминалось в комментарии @Mopower, оригиналом был Cardemo.c.

  2. Переименуйте имя объекта, чтобы оно имело имя основы исходного файла: OBJECTS = sourcefile_name.o

  3. Если переименование любого из двух вышеперечисленных элементов невозможно (или, возможно, файл cardemo.c находится в другом каталоге), добавьте правило компиляции, которое будет собирать файл cardemo.o из исходного_файла_name.c:

    cardemo.o: sourcefile_name.c $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

Я переименовал исходный файл, он был Cardemo.c вместо cardemo.c Спасибо, у меня больше нет ошибки, связанной с правилом.

Mopower 10.01.2023 16:48

Другие вопросы по теме