У меня есть микшеры c и c++ исходных файлов. Я пытаюсь объединить их в.o, необходимые для целевого каталога.
SOURCES: = SOURCES=src/test.c src/cpptest.cpp src/directfb_test.cpp src/foo.c
То, что я пробовал:
OBJECTS=$(SOURCES:src/%.c=$(OBJDIR)/%.o)
OBJECTS+=$(SOURCES:src/%.cpp=$(OBJDIR)/%.o)
и это также
OBJECTS := $(patsubst %.cpp, %.o, $(addprefix $(OBJDIR)/, $(notdir $(SOURCES))))
OBJECTS += $(patsubst %.c, %.o, $(addprefix $(OBJDIR)/, $(notdir $(SOURCES))))
Оба, похоже, не работают.
Я получаю оба.o, а также.c и.cpps в ОБЪЕКТАХ. Есть ли способ добавить OR в patsubst?
Решение:
OBJECTS := $(patsubst %.cpp, %.o,$(addprefix $(OBJDIR)/,$(filter %.cpp ,$(notdir $(SOURCES)) )) )
OBJECTS += $(patsubst %.c, %.o,$(addprefix $(OBJDIR)/,$(filter %.c ,$(notdir $(SOURCES)) )) )
Добавлен фильтр для%.c и%.cpp. Думаю, будут другие способы. Я собираюсь с этим.
Вероятно, самым быстрым для процесса и простым пониманием является
OBJECTS := $(patsubst %c, $(OBJDIR)/%o, $(patsubst %pp, %, $(notdir $(SOURCES))))
Другой способ:
OBJECTS := $(patsubst src/%.cpp, $(OBJDIR)/%.o,$(SOURCES))
OBJECTS := $(patsubst src/%.c, $(OBJDIR)/%.o, $(OBJECTS))
Если вы хотите знать, что неправильно с первыми подходами в вопросе, просто поставьте $(info $(OBJECTS))
между $(info $(OBJECTS))
двумя командами, и это будет довольно ясно.
.h
в исходном каталоге. Если, конечно, вы не перечислили бы их вSOURCES
, что было бы несколько ... эм ... глючно?