Makefile子目录帮助 - 控制放置对象的位置

时间:2016-04-23 01:41:14

标签: c++ makefile

我有一个关于我有的makefile的快速问题。我已经做了一些搜索,但是每个人的文件都是所以不同以至于很难跟上,除非你真的知道make系统,我真的不知道

所以,强制要求我的makefile被称为:

make -f /path/to/src/Makefile "SRCPATH=/path/to/src"

这是(理想情况下)来自不同makefile的所有对象最终都在同一个地方,因为这是从/some/path/Objects_C

这样的目录运行的

我的目录结构如下所示:

src/
  Makefile
  src1.cpp
  src2.cpp
  src3.cpp

src/src_subdir
  subsrc1.cpp
  subsrc2.cpp
  subsrc3.cpp

由于依赖关系,我不能拥有两个makefile,而在上下文中,它更不合理。

无论如何,我的makefile很简单,看起来像是:

SRCPATH ?= .

INCLUDES = -I$.......(all my include paths)

vpath % $(SRCPATH)

CPPFLAGS = -g $(INCLUDES)

    OBJS = src1.o \
       src2.o \
       src3.o \
       $(SRCPATH)/src_subdir/subsrc1.o \
       $(SRCPATH)/src_subdir/subsrc2.o \
       $(SRCPATH)/src_subdir/subsrc3.o

.PHONY : clean all

# ====================================================

libname.a : $(OBJS)
ld -r $(OBJS) -o $@

# ====================================================

现在,我得到了我想要的一半 ...顶级src1.osrc2.osrc3.o出现在我想要的地方(其中make是从Objects_C目录运行,但subsrc.o文件位于/path/to/src/src_subdir。我错过了一些简单的东西,还是我完全旋转了?

我非常感谢任何帮助!每当我觉得我可以用make做基础时,它会让我觉得自己再次成为初学者。

1 个答案:

答案 0 :(得分:1)

如果您想依赖内置规则,则需要修改vpath

子目标对象被定义为/path/to/src/src_subdir/subsrc1.o等,所以这将是他们最终的地方并不奇怪。如果您希望这些对象与其他对象出现在同一个地方,您需要这么说

 OBJS = src1.o \
       src2.o \
       src3.o \
       subsrc1.o \
       subsrc2.o \
       subsrc3.o

现在剩下的就是告知make在哪里可以找到subsrc*.o

vpath %.cpp $(SRCPATH) $(SRCPATH)/src_subdir

正如我评论的那样,您需要确保相应地管理文件名,否则您将度过糟糕的时光。我还更改了vpath模式,因为您现在看起来只需要cpp

Pedantry警报:-g是编译器标志,不是预处理器标志,应该在CXXFLAGS

如果没有vpath,另一个选择是提供明确的规则和配方,例如

SUBOBJS := subsrc1.o subsrc2.o subsrc3.o
$(SUBOBJS): %.o: $(SRCPATH)/src_subdir/%.cpp
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $(OUTPUT_OPTION) $<

这两种方法都会产生完全相同的结果,但是如果文件夹保存相同的源文件名,那么使用vpath这样的方法来阻止所有目标文件的缺点是可能会混淆make。由于您似乎自己管理这些名称,因此不应该成为问题。

第二种方法更安全,因为必须编写自己的规则和食谱会带来轻微的不便。

如果可能,您应该在构建目录中复制源树,因为它极大地简化了makefile。