使用depend将对象文件保存在同一个makefile目录中

时间:2017-01-04 02:55:55

标签: c++ c makefile

我有makefile

appname := fun

srcfiles := $(shell find .. -name "*.cpp")
headerfiles := $(shell find .. -name "*.hpp")
objects  := $(patsubst %.cpp, %.o, $(srcfiles))


all: $(srcfiles) $(appname)

$(appname): $(objects)
    $(CXX) $(LDFLAGS) -o $(appname) $(objects) $(LDLIBS)

depend: .depend

.depend: $(srcfiles) $(headerfiles)
    rm -f ./.depend
    $(CXX) $(CXXFLAGS) -MM $^>>./.depend;

clean:
    rm -f $(appname) $(objects)

dist-clean: clean
    rm -f *~ .depend

include .depend

makefile的父目录包含所有代码(.hpp.cpp文件)。不幸的是,.o文件保存在源代码中,而我希望它们保存在可执行文件的同一目录中(和makefile)。这与Eclipse CDT中的Default相同。

如何修改makefile才能执行此操作?

PS:我发现了类似的问题,例如this一个,但没有一个使用depend来定义$(objects)任务(它们全都是`%。o%形式)

1 个答案:

答案 0 :(得分:1)

当您设置objects变量时,您只需将完整路径名取为.cpp文件,并将后缀替换为.o。因此,如果您有my/sub/dir/foo.cpp这样的文件,那么objects将包含路径my/sub/dir/foo.o。因此,当您编写规则$(appname): $(objects)时,make会尝试构建文件my/sub/dir/foo.o。如果你想让它只构建foo.o,那么你也必须剥离路径,而不仅仅是替换后缀:

objects := $(patsubst %.cpp,%.o,$(notdir $(srcfiles)))

现在,当然,make会说它不知道如何构建foo.o,因为默认规则只知道如何从.o构建.cpp,而不是隐藏在.cpp。{/ p>中的my/sub/dir文件

要完成这项工作,最简单的解决方案是use VPATH,您可以从srcfiles获得的目录列表中构建VPATH的值,如下所示:

VPATH := $(sort $(dir $(srcfiles)))

您可能还考虑使用更好的依赖关系生成解决方案,例如the one described here