c++ - 在单独的文件夹中生成依赖文件

标签 c++ c makefile

我正在尝试为具有以下结构的项目创建 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.obuild/foo.d,其中 build/foo.d 将具有build/foo.o 的自动生成的依赖项。

关于c++ - 在单独的文件夹中生成依赖文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36209876/

相关文章:

C++:通过引用将 std::vector<> 成员返回给临时对象

c++ - Qt/OpenGL 中的着色器问题

c - 警告 : return makes pointer from integer without a cast but returns integer as desired

c - 如何多次附加到字符串?

c++ - g++ header 包括 : still doesn't find definition

我们可以在 make 中运行一个 python 脚本来生成一些 .c 和 .h 文件,然后构建一个镜像吗?

c++ - 如何在 cv::Mat 的边界框中找到最大像素值

c++ - C++ 新手。关于常量指针的问题

c - 使用 exec 后将标准输出重定向到管道

c++ - 如何在无需重新编译的情况下使 Git 提交哈希在 C++ 代码中可用?