Я следующую ситуацию:Как заменить родительский каталог в Makefile
SOURCES=home/main.cpp modelChecking/Configuracao.cpp modelChecking/Estado.cpp modelChecking/Formula.cpp modelChecking/ModelChecking.cpp lib/VisitTree.cpp
SUFIX=$(SOURCES:.cpp=.o)
OBJECTS=$(SUFIX)
all: refiner
refiner: $(OBJECTS)
$(CC) $^ -o refiner
home/main.o: home/main.cpp
$(CC) $(CFLAGS) $< -o [email protected]
modelChecking/Configuracao.o: modelChecking/Configuracao.cpp
$(CC) $(CFLAGS) $< -o [email protected]
modelChecking/Estado.o: modelChecking/Estado.cpp
$(CC) $(CFLAGS) $< -o [email protected]
...
... и так далее.
Как вы можете видеть, у меня есть разные каталоги для компиляции моего исполняемого файла. Теперь я хочу, чтобы поместить каждый файл .o в бен/папке и объектной переменной необходим заменить каждый родительский каталог, и я пробовал разные способы:
OBJECTS=$(SUFIX:%/ = bin/)
OBJECTS=$(subst %/,bin/,$(SUFIX))
OBJECTS=$(patsubst %/,bin/,$(SUFIX))
Когда я использую что-то вроде этого $(subst home/,bin/,$(SUFIX))
он работает, потому что я набираю подстроку «home /», но мне нужно регулярное выражение для замены всех каталогов. И мне нужно сменить цель тоже, возможно, код ниже, работает:
%.o: %.cpp
$(CC) $(CFLAGS) $< -o [email protected]
... Но я предпочитаю каждую цель отдельно
Просто нет. 'make' в значительной степени предполагает, что входные и выходные файлы будут находиться в одном каталоге, за исключением того, что отдельный шаг' install' будет скопировать файлы в их конечные адресаты. Да, вы можете обойти это, но зачем вам? Пойдите с потоком. – reinierpost