Вы можете сделать свой подход, но если у вас когда-нибудь будет файл с таким же именем, у вас возникнут проблемы.Лучше сохранить структуру папок для вашего каталога объектов.Я не тестировал make-файл ниже (но я думаю, что его 99%).Но это дает вам представление о том, как вы можете достичь того, чего хотите - обратите внимание, что в двух папках библиотеки есть дубликаты имен для файлов ...
# Get your source list (use wildcard or what ever, but just for clarity you should end up with a list of files with full paths to start with):
SOURCES = \
lib1/fred.c \
lib1/bob.c \
lib1/carl.c \
lib2/fred.c \
lib2/bob.c \
lib2/carl.c \
# Output folders/targets
OBJ_DIR = obj
BIN_DIR = bin
OUTPUT_FILE = output
# Create your objects list in the obj directory
OBJECTS = $(addprefix $(OBJ_DIR)/,$(addsuffix .o,$(basename $(SOURCES))))
# Create list of unique folders to create
DIRS = $(sort $(dir $(OBJECTS))) $(BIN_DIR)
# Create list of include paths
INCS = $(addprefix -I,$(sort $(dir $(SOURCES))))
# Main target rule
bin/$(OUTPUT_FILE): $(DIRS) $(OBJECTS)
@echo linker: gcc $(OBJECTS) -o $@
@touch $@
# Rule to build your object file - ensure that the folders are created first (also create a dummy obj file) - note this works for parallel builds too (make -j
$(OBJ_DIR)/%.o: %.c | $(DIRS)
@echo compile: gcc $(INCS) -c $? -o $@
@touch $@
# Create your directories here
$(DIRS):
@echo Creating dir: $@
@mkdir -p $@
# Clean if needed
.PHONY: clean
clean:
rm -rf $(OBJ_DIR) $(BIN_DIR)
Если вы действительно хотите сделать это по-своему,вам нужно будет посмотреть на VPATH, я верю - мне никогда не нравилось делать это таким образом, хотя по той причине, о которой я упоминал ранее, я столкнулся слишком много раз в будущем, чтобы когда-либо захотеть использовать снова!:)
Обновлено только что вернулся домой, проверил это и сделал несколько настроек, чтобы убедиться, что оно работает.