После выполнения больших операций манипулирования данными часто необходимо обновлять базовые индексы. Можно сделать это при помощи UPDATE STATISTICS [таблица] оператор.
другая опция состоит в том, чтобы отбросить и воссоздать индекс, который, если Вы делаете большие вставки данных, вероятно, выполнит вставки намного быстрее. Можно даже включить это в хранимую процедуру.
Есть как минимум два способа сделать это. Во-первых (и что я бы порекомендовал) вы можете добавить каталог сборки к целевым именам (даже при использовании шаблонного правила). Например:
$(OBJS) : build/%.o : %.cpp
Во-вторых, вы можете использовать переменную VPATH, чтобы указать программе make искать необходимые компоненты в другом каталоге. Это, вероятно, наиболее часто используемый подход. У него есть, по крайней мере, один серьезный недостаток, и если вы воспользуетесь им, а позже столкнетесь с проблемами с «дубликатами», то решить проблему не удастся. При первом подходе вы всегда можете отразить структуру исходных каталогов под каталогом сборки, чтобы избежать конфликтов дубликатов.
Изменить: В моем предыдущем ответе было немного мало деталей, поэтому я расширю его, чтобы показать, что это действительно работает как рекламируется. Вот полный рабочий пример Makefile, который использует первый метод, описанный выше, для решения проблемы. Просто вставьте это в Makefile и запустите make - все остальное он сделает и покажет, что это действительно работает.
Изменить: Я не могу понять, как заставить SO разрешать символы табуляции в моем ответе текст (он заменил их пробелами). После копирования и вставки этого примера вам нужно будет преобразовать начальные пробелы в командных сценариях в табуляции.
BUILD_DIR := build
SRCS := \
a.c \
b.c \
c.c \
a/a.c \
b/b.c \
c/c.c
OBJS := ${SRCS:%.c=${BUILD_DIR}/%.o}
foo: ${OBJS}
@echo Linking $@ using $?
@touch $@
${BUILD_DIR}/%.o: %.c
@mkdir -p $(dir $@)
@echo Compiling $< ...
@touch $@
${SRCS}:
@echo Creating $@
@mkdir -p $(dir $@)
@touch $@
.PHONY: clean
clean:
rm -f foo
rm -f ${OBJS}
В частности, обратите внимание, что есть исходные файлы с повторяющимися именами (ac и a / ac, bc и b / bc и т. д.), и это не вызывает никаких проблем. Также обратите внимание, что VPATH не используется, чего я рекомендую избегать из-за присущих ему ограничений.
Просто вставьте это в Makefile и запустите make - все остальное он сделает и покажет, что это действительно работает.Изменить: Я не могу понять, как заставить SO разрешать символы табуляции в моем ответе текст (он заменил их пробелами). После копирования и вставки этого примера вам необходимо преобразовать начальные пробелы в командных сценариях в табуляции.
BUILD_DIR := build
SRCS := \
a.c \
b.c \
c.c \
a/a.c \
b/b.c \
c/c.c
OBJS := ${SRCS:%.c=${BUILD_DIR}/%.o}
foo: ${OBJS}
@echo Linking $@ using $?
@touch $@
${BUILD_DIR}/%.o: %.c
@mkdir -p $(dir $@)
@echo Compiling $< ...
@touch $@
${SRCS}:
@echo Creating $@
@mkdir -p $(dir $@)
@touch $@
.PHONY: clean
clean:
rm -f foo
rm -f ${OBJS}
В частности, обратите внимание, что есть исходные файлы с повторяющимися именами (ac и a / ac, bc и b / bc и т. д.), и это не вызывает никаких проблем. Также обратите внимание, что VPATH не используется, чего я рекомендую избегать из-за присущих ему ограничений.
Просто вставьте это в Makefile и запустите make - все остальное он сделает и покажет, что это действительно работает.Изменить: Я не могу понять, как заставить SO разрешать символы табуляции в моем ответе текст (он заменил их пробелами). После копирования и вставки этого примера вам необходимо преобразовать начальные пробелы в командных сценариях в табуляции.
BUILD_DIR := build
SRCS := \
a.c \
b.c \
c.c \
a/a.c \
b/b.c \
c/c.c
OBJS := ${SRCS:%.c=${BUILD_DIR}/%.o}
foo: ${OBJS}
@echo Linking $@ using $?
@touch $@
${BUILD_DIR}/%.o: %.c
@mkdir -p $(dir $@)
@echo Compiling $< ...
@touch $@
${SRCS}:
@echo Creating $@
@mkdir -p $(dir $@)
@touch $@
.PHONY: clean
clean:
rm -f foo
rm -f ${OBJS}
В частности, обратите внимание, что есть исходные файлы с повторяющимися именами (ac и a / ac, bc и b / bc и т. д.), и это не вызывает никаких проблем. Также обратите внимание, что VPATH не используется, чего я рекомендую избегать из-за присущих ему ограничений.
вам нужно будет преобразовать начальные пробелы в командных сценариях в табуляции.BUILD_DIR := build
SRCS := \
a.c \
b.c \
c.c \
a/a.c \
b/b.c \
c/c.c
OBJS := ${SRCS:%.c=${BUILD_DIR}/%.o}
foo: ${OBJS}
@echo Linking $@ using $?
@touch $@
${BUILD_DIR}/%.o: %.c
@mkdir -p $(dir $@)
@echo Compiling $< ...
@touch $@
${SRCS}:
@echo Creating $@
@mkdir -p $(dir $@)
@touch $@
.PHONY: clean
clean:
rm -f foo
rm -f ${OBJS}
В частности, обратите внимание, что есть исходные файлы с повторяющимися именами (ac и a / ac, bc и b / bc и т. д.), и это не Не вызывает никаких проблем. Также обратите внимание, что VPATH не используется, чего я рекомендую избегать из-за присущих ему ограничений.
вам нужно будет преобразовать начальные пробелы в командных сценариях в табуляции.BUILD_DIR := build
SRCS := \
a.c \
b.c \
c.c \
a/a.c \
b/b.c \
c/c.c
OBJS := ${SRCS:%.c=${BUILD_DIR}/%.o}
foo: ${OBJS}
@echo Linking $@ using $?
@touch $@
${BUILD_DIR}/%.o: %.c
@mkdir -p $(dir $@)
@echo Compiling $< ...
@touch $@
${SRCS}:
@echo Creating $@
@mkdir -p $(dir $@)
@touch $@
.PHONY: clean
clean:
rm -f foo
rm -f ${OBJS}
В частности, обратите внимание, что есть исходные файлы с повторяющимися именами (ac и a / ac, bc и b / bc и т. д.), и это не Не вызывает никаких проблем. Также обратите внимание, что VPATH не используется, чего я рекомендую избегать из-за присущих ему ограничений.
vpath %.cpp src src/b src/c
Затем обращайтесь к исходным файлам без имени их каталога; Make будет искать vpath .
Создание плоской структуры каталогов в соответствии с первоначальным запросом.
Использует vpath
для отслеживания исходных файлов, но все ведение документации выполняется автоматически из Список SRC
.
SRC = a/a.c a/aa.c b/b.c
TARGET = done
FILES = $(notdir $(SRC) )
#make list of source paths, sort also removes duplicates
PATHS = $(sort $(dir $(SRC) ) )
BUILD_DIR = build
OBJ = $(addprefix $(BUILD_DIR)/, $(FILES:.c=.o))
DEP = $(OBJ:.o=.d)
# default target before includes
all: $(TARGET)
include $(DEP)
vpath %.c $(PATHS)
# create dummy dependency files to bootstrap the process
%.d:
echo a=1 >$@
$(BUILD_DIR)/%.o:%.c
echo $@: $< > $(patsubst %.o,%.d,$@)
echo $< >$@
$(TARGET): $(OBJ)
echo $^ > $@
.PHONY: clean
clean:
del $(BUILD_DIR)/*.o
del $(BUILD_DIR)/*.d
Извините за уродливые echo
, но у меня был только ящик с выигрышем, чтобы проверить его.