在单独的文件夹中生成依赖项文件

时间:2016-03-24 20:58:05

标签: c++ c makefile

我正在尝试为具有以下结构的项目创建一个makefile:

├──bin/
├──build/
│  ├──foo.d
│  └──bar.d
├──include/
│  └──foo.h
│
├──lib/
├──src/
│  ├──foo.cc
│  └──bar.cc
│
├──Makefile

这是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)

1 个答案:

答案 0 :(得分:2)

删除所有sed废话。 gcc可以一次性生成所有内容:

$(builddir)/%.o : $(srcdir)/%.cc
    $(CPP) -c $< -o $@ -MP -MMD -MF $(@:.o=.d)

这将一次性构建build/foo.obuild/foo.d,其中build/foo.d将具有build/foo.o的自动生成的依赖项。

相关问题