如何替换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 $@
modelChecking/Configuracao.o: modelChecking/Configuracao.cpp
    $(CC) $(CFLAGS) $< -o $@
modelChecking/Estado.o: modelChecking/Estado.cpp
    $(CC) $(CFLAGS) $< -o $@
...

等等

正如您所看到的,我有不同的目录来编译我的可执行文件。现在,我想把每个文件.o都放在bin/文件夹中,变量OBJECT必须替换每个父目录,我尝试了不同的方法:

OBJECTS=$(SUFIX:%/ = bin/)
OBJECTS=$(subst %/,bin/,$(SUFIX))
OBJECTS=$(patsubst %/,bin/,$(SUFIX))

当我使用类似$(subst home/,bin/,$(SUFIX))的东西时,它是有效的,因为我键入子字符串"home/",但我需要一个正则表达式来替换所有目录。我也需要更改目标,也许下面的代码会起作用:

%.o: %.cpp
    $(CC) $(CFLAGS) $< -o $@

但我更喜欢每个目标单独的

您正在寻找SUFIX=$(addprefix bin/,$(notdir $(SOURCES:.cpp=.o)))

Makefile看起来像:

SOURCES=home/main.cpp modelChecking/Configuracao.cpp
SUFIX=$(addprefix bin/,$(notdir $(SOURCES:.cpp=.o)))
OBJECTS=$(SUFIX)
all: refiner
refiner: $(OBJECTS)
     $(CC) $^ -o refiner
bin/main.o: home/main.cpp
     $(CC) $(CFLAGS) -c $< -o $@
bin/Configuracao.o: modelChecking/Configuracao.cpp
     $(CC) $(CFLAGS) -c $< -o $@

但是我建议使用SUBDIRS。创建到Makefiles

Makefile

SUBDIRS = bin
.PHONY: subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
    $(MAKE) -C $@

bin/Makefile

SOURCES=../home/main.cpp ../modelChecking/Configuracao.cpp
SUFIX=$(addprefix bin/,$(notdir $(SOURCES:.cpp=.o)))
OBJECTS=$(SUFIX)
all: refiner
refiner: $(OBJECTS)
    $(CC) $^ -o refiner
main.o: ../home/main.cpp
    $(CC) $(CFLAGS) -c $< -o $@
Configuracao.o: ../modelChecking/Configuracao.cpp
    $(CC) $(CFLAGS) -c $< -o $@

这样您就不必担心对象前缀了。

最新更新