我有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%形式)
答案 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。