Удивительно, что это работает в Windows. Есть несколько вещей, которые проблематичны в этом make-файле. Один:
OBJS = $(addprefix $(OBJ_PATH)/, $(notdir %/$(subst .c,.o,$(CSRCS))))
Это сбивает с толку. notdir
ничего не делает с шаблонами, поэтому добавление %/
(только к первому аргументу!) Ничего не делает. Также использование subst
не является хорошей идеей, поскольку оно меняет каждый экземпляр .c
, даже если он появляется в середине файла; например, ../x.comp.c
изменится на ../x.oomp.o
. Эта строка должна быть:
OBJS = $(patsubst %.c,$(OBJ_DIR)/%.o,$(notdir $(CSRCS)))
Далее, это не правильно:
$(OBJ_PATH)/%.o: $(SRCS)
$(CC) $(CFLAGS) $(filter %/$(subst .o,.c,$(notdir $@)), $(SRCS)) -o $@
Это делает каждый объектный файл зависимым от всех исходных файлов, поэтому при изменении любого исходного файла каждый объектный файл будет перестроен. Вы также можете просто создать сценарий оболочки вместо использования make. Вот почему вы должны пройти через искажения в рецепте, чтобы найти C-файл, который вы хотите скомпилировать. Лучше было бы использовать VPATH . Кроме того, вам нужно иметь опцию -c
в строке компилятора для создания объектных файлов ... Я не вижу, чтобы она добавлялась к вашему CFLAGS
, но лучшие практики не помещают ее в любом случае:
vpath %.c $(sort $(dir $(CSRCS)))
$(OBJ_PATH)/%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Далее эта строка не хороша:
$(OBJS): directories
Это будет перестраивать все объекты всякий раз, когда необходимо перестроить цель directories
, что всегда происходит потому, что ни одно правило не создает эту цель: цель directories
никогда не создает файл с именем directories
, поэтому он всегда устарел.
Несмотря на это, я не могу объяснить ошибку, которую вы видите. Компоновщик жалуется на файл, который не существует, но этот файл (очевидно) является предварительным условием для цели, что означает, что если он не существует, make попытается создать его или пожалуется, если не сможет.
После исправления вашего make-файла я рекомендую запустить make -d
(перенаправить в файл, поскольку выходные данные будут значительными) и найти цель configServer.o
и посмотреть, что make скажет об этом.