#c #makefile
#c #создание файла #makefile
Вопрос:
Я пытаюсь написать Makefile для компиляции двух программ, которые содержат один и тот же файл .h (тоже мой), но с моим фактическим Makefile, если я набираю «make» в командной строке два раза подряд, я не получаю «bla bla обновлен», он перекомпилирует часть материала, когда в этом нет необходимости. Есть какой-нибудь способ сделать это в более эффективной форме?
Контекст
producer.c
и consumer.c
#include random_numbers.h
для того, чтобы генерировать случайные числа для своих функций.
Мой Makefile
CC = gcc
FLAGS = -Wall -g
LIBS = -lrt -lpthread
HEADER_FILES_DIR = .
INCLUDES = -I $(HEADER_FILES_DIR)
SRCS = e1_producer.c e1_consumer.c $(HEADER_FILES_DIR)/random_num.c
OBJ = $(SRC:.c=.co)
DEPS = $(HEADER_FILES_DIR)/random_num.h
all: e1_producer e1_consumer
random_num.o: random_num.c random_num.h
$(CC) $(FLAGS) -c random_num.c
e1_producer: e1_producer.o random_num.o
$(CC) $(FLAGS) -o producer e1_producer.o random_num.o $(LIBS)
e1_producer.o: e1_producer.c
$(CC) $(FLAGS) -c e1_producer.c $(LIBS)
e1_consumer: e1_consumer.o random_num.o
$(CC) $(FLAGS) -o consumer e1_consumer.o random_num.o $(LIBS)
e1_consumer.o: e1_consumer.c
$(CC) $(FLAGS) -c e1_consumer.c $(LIBS)
clean:
rm producer consumer *.o
Вывод после двух последовательных «make» в командной строке
$ make
$ gcc -Wall -g -c e1_producer.c -lrt -lpthread
$ gcc -Wall -g -c random_num.c
$ gcc -Wall -g -o producer e1_producer.o random_num.o -lrt -lpthread
$ gcc -Wall -g -c e1_consumer.c -lrt -lpthread
$ gcc -Wall -g -o consumer e1_consumer.o random_num.o -lrt -lpthread
$ make
gcc -Wall -g -o producer e1_producer.o random_num.o -lrt -lpthread
gcc -Wall -g -o consumer e1_consumer.o random_num.o -lrt -lpthread
Почему это происходит? Когда я делаю то же самое с другой отдельной программой, вторая $ make
возвращает мне «ничего не нужно делать, бла-бла-бла обновлена»
Комментарии:
1. Попробуйте удалить
$(LIBS)
при создании файлов .o. Это не требуется.2. Вы нарушаете правило 2 (ненормативных, но настоятельно рекомендуемых) Правил Makefiles . Правило для
e1_producer
не создает файл с именемe1_producer
, аналогично дляe1_consumer
.3. @dbush спасибо, я не учел это!
4. @user657267 это не было моей главной проблемой, но приятно знать, спасибо, приятель
5. @S.Buzzoni Это точно ваша проблема, но не верьте мне на слово, попробуйте.