Как именно я использую make-файл? - PullRequest
1 голос
/ 03 декабря 2009

Я сейчас очень запутался.

Итак, у меня есть 5 файлов: main.c, flight.c, flight.h, passenger.c и passenger.h

flight.h имеет функциональные прототипы для flight.c, а passenger.h имеет функциональные прототипы для passenger.c

flight.c и passenger.c имеют определения для этих функций.

main.c - это программа, с которой я буду взаимодействовать, вызывая функции из обоих .c файлов

Я не совсем уверен, для чего нужны .o файлы, кто-нибудь, пожалуйста, объясните? Вот мой Makefile:

flight.o: flight.c flight.h
    gcc -Wall -g -c flight.c    
passenger.o: passenger.c passenger.o
    gcc -Wall -g -c passenger.c    
main.o: main.c
    gcc -Wall -g -c main.c     
reservations.out: main.o flight.o passenger.o
    gcc -Wall -g flight.o passenger.o main.o -o reservations.out

РЕДАКТИРОВАТЬ: Затем я использую команду "make Makefile" и получаю ошибку: make: Ничего не нужно делать для `Makefile '.

В моем файле есть вкладка перед gcc. Буду признателен за любую помощь, я уверен, что есть много вещей, которые я делаю неправильно. Спасибо.

Ответы [ 3 ]

10 голосов
/ 03 декабря 2009

Ваша проблема в том, что вы используете неправильную команду. Я бы добавил следующую строку в начало вашего make-файла:

all: reservations.out

Затем просто введите make в командной строке. Если вы не хотите редактировать файл, просто используйте make reservations.out, и вы должны получить правильное поведение.

Что касается файла .o: это файл объекта, то есть он содержит скомпилированный (но в данном случае не связанный) код. Ваше окончательное правило make-файла берет объектные файлы и связывает их вместе в конечный исполняемый файл с именем reservations.out.

Теперь, когда я посмотрю еще немного, похоже, что у вас есть странное поведение в отношении вашего последнего правила. Я думаю, это должно выглядеть больше как:

reservations.out: main.o flight.o passenger.o
    gcc -Wall -g main.o flight.o passenger.o -o reservations.out

Кроме того, у вас есть passenger.o в качестве предпосылки passenger.o, что наверняка вызовет у вас проблемы. Я хотел бы сделать что-то вроде этого (это может быть даже труднее, но я пытаюсь сделать это просто):

.PHONY: all clean

all: reservations.out

flight.o: flight.c flight.h
    gcc -Wall -g -c flight.c    

passenger.o: passenger.c passenger.h
    gcc -Wall -g -c passenger.c    

main.o: main.c
    gcc -Wall -g -c main.c     

reservations.out: main.o flight.o passenger.o
    gcc -Wall -g main.o flight.o passenger.o -o reservations.out

clean:
    rm -f *.o reservations.out

Но то, что я бы действительно сделал, если вы хотите узнать немного подробнее, ниже. Это может быть немного излишним для такого маленького проекта, но его также легче настроить и настроить при необходимости.

.PHONY: all clean

BIN = reservations
OBJ = flight.o passenger.o main.o

all: $(BIN)

%.o: %.c %.h
    gcc -Wall -g -c $<

main.o: main.c
    gcc -Wall -g -c $<

$(BIN): $(OBJ)
    gcc -Wall -g -o $@ $^

clean:
    rm -f $(OBJ) $(BIN)

Я рекомендую ознакомиться с инструкцией GNU make , чтобы узнать больше обо всех необычных вещах, которые вы можете сделать.

2 голосов
/ 03 декабря 2009

Я не совсем уверен, что .o файлы кто-нибудь, пожалуйста, не забудьте объяснить?

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

1 голос
/ 03 декабря 2009

make имеет неявные правила для создания двоичных файлов из источника C, вам не нужно задавать явные правила для этого.

Так что ваш минималистичный Makefile будет выглядеть как

CFLAGS = -Wall -g
.PHONY all clean

all: myprogram

myprogram: source1.c source2.c

clean:
    rm -f myprogram

У него есть один полезный побочный эффект - все промежуточные файлы (*.o файлы в вашем случае) будут автоматически удалены после компиляции.

Опции из CFLAGS будут добавлены в gcc командную строку - make неявное правило делает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...