Написание Makefile для генерации измененного, сборочного, перемещаемого и исполняемого файла из программы на C - PullRequest
0 голосов
/ 21 сентября 2019

Я использую CentOS для написания Makefile для генерации этих файлов из программы на C:

  1. hello.i (измененная исходная программа, текст)
  2. hello.s (Программа сборки, текст)
  3. hello.o (перемещаемая объектная программа, двоичная)
  4. hello (исполняемая объектная программа, двоичная)

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

Программа C (называемая hello.c)

#include <stdio.h>
int main() {
   printf("Hello, World!");
   return 0;
}

Makefile

all: hello

hello:
      gcc -I hello.c -o hello.i

hello.o:
      gcc -c hello.c -o hello.o

hello.s:
      gcc -S hello.i -o hello.s

hello.i:
      gcc ???

clean:
      rm -rf *.o hello

Кроме того, чистая команда для удаления всех.

Ошибка при получении: make all

компиляция прекращена.make: *** [hello] Ошибка 4

Я знаю, что есть одна команда для генерации всего сразу, но я хочу сделать это пошагово.Это мой первый Makefile, который я пытаюсь сделать, и я еще не на 100% знаком.

Что я делаю неправильно, может быть, неправильный флаг?

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

Ответы [ 2 ]

2 голосов
/ 21 сентября 2019

Без hello.i, что для меня неясно, что должно быть, ваш файл make должен выглядеть следующим образом:

all: hello hello.s

hello: hello.c hello.o
    gcc hello.o -o hello

hello.o: hello.c
    gcc -c hello.c -o hello.o

hello.s: hello.c
    gcc -S hello.c -o hello.s

clean:
    rm -rf *.o

У вас проблема в том, что в Makefile после точки с запятой вы должны указатьзависимости (файлы, которые должны быть созданы для текущего вывода).

В вашем случае all заявляет, что hello и hello.s обязательны для заполнения.Затем make ищет, чтобы произвести их, используя данные команды.Hello объявляет, что hello.o требуется, поэтому он также ищет данную команду для ее создания.

hello.o и hello.o объявляют, что hello.c требуется, поэтому make проверитесли он находит файл и при да, он запускает команду gcc.Теперь, когда hello.o произведен, он вернется к выдаче hello.

Команды должны иметь отступы с правильными вкладками, поэтому, если вы копируете вставку, убедитесь, что у вас есть вкладки и нет нескольких пробелов.

1 голос
/ 21 сентября 2019

Ну, вы не объявили рецепт для hello.i, и вы не объявили соответствующие зависимости для других рецептов.Кроме того, параметр командной строки для создания hello.i имеет значение -E, а не -I.

Давайте посмотрим:

  • hello нужен файл hello.o
  • hello.i нужен файл hello.c
  • hello.o нужен файл hello.c
  • hello.s нужен файл hello.i

Это будет правильный make-файл:

all: hello

hello: hello.o
    gcc hello.o -o hello

hello.i: hello.c
    gcc -E hello.c -o hello.i

hello.o: hello.c
    gcc -c hello.c -o hello.o

hello.s: hello.i
    gcc -S hello.i -o hello.s

clean:
    rm -rf *.o hello

Кроме того, используя специальные переменные Make, вы можете использовать $@ для обозначения текущего рецепта и $< для обозначения первой зависимости, делаяэто менее многословно, как это:

all: hello

hello: hello.o
    gcc $< -o $@

hello.i: hello.c
    gcc -E $< -o $@

hello.o: hello.c
    gcc -c $< -o $@

hello.s: hello.i
    gcc -S $< -o $@

clean:
    rm -rf *.o hello
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...