Подтвердить что ты не робот

Gmake скомпилировать все файлы в каталоге

у нас есть некоторый код на С++, который нам нужен для создания файла make. Каждая пара .h и .C создает объект, а затем некоторые объекты соединяются вместе, чтобы сформировать исполняемый файл. Довольно стандартный материал.

Эта команда не-gnu make просто создает все файлы в объекте в каталоге

%.o:%.C
    $(CC) $(CPFLAGS)  -c  $<

Что это делает для каждого файла%.C(т.е. каждый .C файл), создайте соответствующий файл .o.

Кто-нибудь знает, как это сделать с помощью gmake?

Приветствия

Марк

4b9b3361

Ответ 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)

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