使用多个目录构建Makefile

时间:2013-08-14 09:44:11

标签: c++ makefile

我正在尝试编译具有以下结构的项目

项目:

  • 生成文件
  • 可执行
  • Source1的
    • .CXX
    • ·H
  • 源2
    • .CXX
    • ·H
  • 生成
    • *。Ø

我在编写Makefile进行编译时遇到了困难。我目前有如下命令:

Src1 = $(wildcard $(SRCDIR1)/*.cxx)
Obj1 = $(patsubst $(SRCDIR1)/%.cxx, $(OBJDIR)/%.o, $(Src1))

但是我很难为目标文件制作编译规则a)因为我不能再做了:

$(Obj1): %.cxx
    $(CXX) $(CFLAGS) -c $(@:.o=.cxx) -o $@

因为'$ @'命令现在包含构建目录的路径和b)因为先决条件现在包括构建路径,我应该有一个源路径。我已经阅读了大量的make手册试图找到解决方案,但没有运气。 对解决方案的任何帮助表示赞赏 千斤顶

2 个答案:

答案 0 :(得分:0)

从个人经验来看,在玩了一些“原始”Makefile后,我真的建议你使用一些工具来构建Makefile,比如automakecmake

您仍然需要手动指定所有源文件 - 但至少我更喜欢手动摆弄Makefile。

答案 1 :(得分:0)

我更喜欢的一个选项是在构建目录中构建一个同构目录结构。也就是说,源文件${src_dir}/project_x/main.cxx构建为${build_dir}/project_x/main.o。这样,当不同源目录中存在具有相同名称的源文件时,可以防止名称冲突。编译器规则类似于:

${obj_dir}/%.o : ${src_dir}/%.cxx # % includes directory name, e.g. project_x/main
    @-mkdir -p ${@D}
    ${CXX} -c -o $@ ${CPPFLAGS} ${CXXFLAGS} $<

注意在上面它如何动态创建目标目录。这有点过于简单,在实际构建系统中,目标文件依赖(使用order-only dependency)在其目录中,以便make自动创建目标目录(如果它不存在)而不是推测性地尝试为每个目标对象文件创建它们,即使它已经存在。