Создать файл для нескольких программ

#c #c #makefile

Вопрос:

У меня есть p1.c p2.c pn.c , файлы a sharedprg.c и a sharedprg.h в каталоге, я хочу создать файл make для компиляции всех этих программ, например, что-то вроде этого

 for i in {1..n}    // just a pseudo code to tell what's in my mind
   gcc -o p$i p$i.c sharedprg.c
 

И каждый раз, когда я вызываю make его, он должен просто повторно компилироваться pi , если pi.c он изменен, или-иначе компилировать все программы, если sharedprg.c они изменены или shareprg.h изменены. Есть ли какой-нибудь способ, которым я могу этого достичь?

Редактировать: Я бы получил желаемый результат, используя этот код

 shared = sharedMem.c sharedMem.h
all: p1 p2 p3 

%.o: %.c 
    gcc -c $^

p1: p1.o $(shared) 
    gcc -o p1 p1.o sharedMem.c

p2: p2.o $(shared) 
    gcc -o p2 p2.o sharedMem.c

p3: p3.o $(shared) 
    gcc -o p3 p3.o sharedMem.c

clean:
    rm -f *.o p1 p2 p3
 

Но, пожалуйста, предложите, если есть лучший или более простой способ (без добавления $(shared) везде)

Комментарии:

1. Возможно, сначала соберите переменную со всеми целями (исполняемыми файлами, которые вы хотите создать). Затем напишите правила с подстановочными знаками, чтобы описать зависимости между целевым объектом и соответствующими исходными файлами. (Изучите Файлы Создания)


Ответ №1:

Если вы измените $^ $< значение «кому» в правиле компиляции, вы можете добавить дополнительные предварительные условия заголовка отдельно. Вы также можете добавить предварительные условия для нескольких целей одновременно. Немного вдохновения:

 # default target; build all
all: p1 p2 p3

# Fix compile rule to only compile the source (excluding any header prerequisites)
%.o: %.c
    gcc -c

lt;

# programs depend on their respective .o (Static Pattern Rule)
# https://www.gnu.org/software/make/manual/html_node/Static-Usage.html
p1 p2 p3: %: %.o

# all objects depend on sharedMem.h
p1.o p2.o p3.o: sharedMem.h

# all programs depend on sharedMem.o (which is made from sharedMem.c)
p1 p2 p3: sharedMem.o

Встроенные правила делают это за вас, поэтому вы можете удалить строку gcc ... рецепта. Если вы новичок, проще всего придерживаться их. Видишь https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html

Комментарии:

1. Просто хочу отметить, что ваш p1 p2 p3: %: %.o не нужен: существует встроенное правило для создания программы из ее .o файла. Вы действительно хотите добавить начальную all цель, например all: p1 p2 p3 , чтобы запуск make сам по себе создавал все программы.

2. @MadScientist Я думал, что встроенный применяется только в том случае, если не было никаких других предварительных условий для объектных файлов, что не так, поскольку SharedMem.o также является обязательным условием.

3. Встроенные правила будут найдены, если нет определенных пользователем неявных или явных правил, которые могли бы создать рассматриваемую цель.