Gmake скомпилировать все файлы в каталоге
у нас есть некоторый код на С++, который нам нужен для создания файла make. Каждая пара .h и .C создает объект, а затем некоторые объекты соединяются вместе, чтобы сформировать исполняемый файл. Довольно стандартный материал.
Эта команда не-gnu make просто создает все файлы в объекте в каталоге
%.o:%.C
$(CC) $(CPFLAGS) -c $<
Что это делает для каждого файла%.C(т.е. каждый .C файл), создайте соответствующий файл .o.
Кто-нибудь знает, как это сделать с помощью gmake?
Приветствия
Марк
Ответы
Ответ 1
Синтаксис, который вы показали, называется шаблоном в GNU make parlance, и он образует краеугольный камень вашего решения. Все, что вам нужно, это добавить способ получения списка файлов .C динамически. Другие продемонстрировали решения, которые используют $(shell)
для этого, но это бесполезно неэффективно. Я предлагаю вам вместо этого использовать $(wildcard), который представляет собой встроенную функцию GNU, предназначенную для этой цели:
SRCS = $(wildcard *.C)
OBJS = $(patsubst %.C,%.o,$(SRCS))
foo: $(OBJS)
$(CC) -o [email protected] $^
%.o: %.C
$(CC) $(CPFLAGS) -c $<
Если вы ищете что-то более сжатое, следующее будет работать:
foo: $(patsubst %.C,%.o,$(wildcard *.C))
Это просто исключает переменные и использует тот факт, что GNU make предоставляет правило шаблона по умолчанию %.o: %.C
, а также правило по умолчанию для связывания исполняемого файла вместе с набором объектов. Лично я бы использовал более подробную версию, поскольку мне было легче читать и поддерживать ее, но каждый из них.
Надеюсь, что это поможет,
Эрик Мельский
Ответ 2
Это пример правила шаблона , он должен отлично работать в gmake
. Для очень простых построений, подобных этому, вы можете в основном полагаться на неявные правила. Главное, что вы должны указать в целевом объекте, который хотите построить, и его зависимостях:
CXXFLAGS:=-g -O -Iincludes
LDFLAGS:=-lm
SRCS:=$(shell ls *.C) # select all .C files as source
OBJS:=$(substr .C,.o,$(SRCS) # list the corresponding object files
foo : $(OBJS)
Обратите внимание на использование просто расширенной переменной оператора присваивания (:=
), а не оператора рекурсивного присваивания (=
), который может уменьшите количество переработки, сделанное в более сложных сборках.