我正在尝试为具有以下结构的项目创建 makefile:
├──bin/
├──build/
│ ├──foo.d
│ └──bar.d
├──include/
│ └──foo.h
│
├──lib/
├──src/
│ ├──foo.cc
│ └──bar.cc
│
├──Makefile
这是生成文件:
# Define the compiler and the linker.
CXX = g++
CC = g++
# Folders
srcdir = src
builddir = build
out = bin
# Define preprocessor, compiler, and linker flags.
CPPFLAGS = -I include -std=c++11
LDFLAGS = -g -Llib
# Phony targets
.PHONY: all clean test
# Targets
all : $(out)/bar
$(out)/bar : $(addprefix $(builddir)/,bar.o foo.o)
# Standard clean
clean :
rm -f $(builddir)/*.o $(builddir)/*.d
# Generate dependencies in *.d files
$(builddir)/%.d: $(srcdir)/%.cc
@set -e; rm -f $@; \
$(CPP) -MM $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,$(builddir)/\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$;
deps = $(patsubst $(srcdir)/%.cc,$(builddir)/%.d,$(wildcard $(srcdir)/*.cc))
include $(deps)
依赖文件包含以下内容:
foo.d
build/foo.o build/foo.d : src/foo.cc include/foo.h
bar.d(取决于 foo)
build/bar.o build/bar.d : src/bar.cc include/foo.h
有什么方法可以在 build/目录中生成 .d 文件,将目标文件编译到同一个文件夹中,然后编译 bin/bar 程序?任何帮助表示赞赏。
编辑:
问题是我在期待
all : $(out)/foo
$(out)/foo : $(addprefix $(builddir)/,foo.o bar.o)
$(builddir)/%.o : $(srcdir)/%.cc
$(CXX) -c $< -o $@ -MP -MMD -MF $(@:.o=.d)
神奇地编译程序 foo(当所有文件都在同一个文件夹中时它起作用)。
相反,我必须指定配方:
all : $(out)/foo
$(out)/foo : $(builddir)/foo.o $(builddir)/bar.o
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -o $@
$(builddir)/%.o : $(srcdir)/%.cc
$(CXX) -c $< -o $@ -MP -MMD -MF $(@:.o=.d)
最佳答案
丢弃所有 sed
废话。 gcc 可以一次性生成所有内容:
$(builddir)/%.o : $(srcdir)/%.cc
$(CPP) -c $< -o $@ -MP -MMD -MF $(@:.o=.d)
这将一次性构建 build/foo.o
和 build/foo.d
,其中 build/foo.d
将具有build/foo.o
的自动生成的依赖项。
关于c++ - 在单独的文件夹中生成依赖文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36209876/