C++ 在单独的文件夹中生成依赖项文件
我正在尝试为具有以下结构的项目创建makefile:C++ 在单独的文件夹中生成依赖项文件,c++,c,makefile,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 buildd
├──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)
条形图d(取决于foo)
有没有办法在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)
all:$(out)/foo
$(out)/foo:$(addprefix$(builddir)/,foo.obar.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)
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)
$(builddir)/%.o:$(srcdir)/%.cc
$(CPP)-c$<-o$@-MP-MMD-MF$(@:.o=.d)
这将一次性生成
build/foo.o
和build/foo.d
,其中build/foo.d
将自动生成build/foo.o
的依赖项 请注意,依赖关系规则是项目开发人员的便利,而不是实际的构建需求。如果您只是希望尽可能快速、轻松地从裸源发行版转换为二进制发行版,那么请避免生成依赖关系规则。在这种情况下,你知道你无论如何都需要构建一切。然而,关于所提出的问题,我不清楚你在问什么。如何在build
目录中而不是在别处生成.d
文件?如何编写make规则,允许您描述的所有步骤由一个make
运行触发?还有什么吗?为了清楚起见,我更新了问题。我试图为其编写makefile的实际项目有很多文件。使用一个文件夹时生成的文件非常干净高效。我只是想在迁移到一个合适的项目文件夹结构时保持依赖项的自动生成。好吧,但是您所展示的Makefile
有什么问题吗?真正的问题是什么?我希望我有足够的分数来支持你的回答。我的makefile并没有什么问题,而是对我认为它将实现的功能产生了误解。由于所有文件都在一个文件夹中,make自动运行生成程序的方法,但由于有几个文件夹,我不得不自己定义它。谢谢。由于某种原因,这给了我foo.o:file not recognized:file format not recognized collect2:error:ld返回了1退出状态
@SebastianN在什么上下文中?当我认为我的问题与依赖项生成相关时,我错了,这只是一个新手在定义配方时犯的错误。我在上面发布的错误是因为我在食谱中使用了$(CPP)
而不是$(CXX)
。感谢您提供了比我的教授建议的基于sed的依赖项生成更干净的版本。您可以删除-MF$(@:.o=.d)
部分,因为它是由-MMD
自动完成的。
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)
$(builddir)/%.o : $(srcdir)/%.cc
$(CPP) -c $< -o $@ -MP -MMD -MF $(@:.o=.d)