Какая правильная или эффективная форма для записи Makefile, когда вам нужны два исполняемых файла, которые используют одну и ту же библиотеку?

#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 Это точно ваша проблема, но не верьте мне на слово, попробуйте.