【问题标题】:Structuring Makefiles with multiple directories使用多个目录构建 Makefile
【发布时间】:2013-08-16 04:53:55
【问题描述】:

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

项目:

  • 制作文件
  • 可执行文件
  • 来源1
    • .cxx
    • .h
  • 来源2
    • .cxx
    • .h
  • 构建
    • *.o

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

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

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

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

因为 '$@' 命令现在包括构建目录的路径,并且 b) 因为先决条件现在包括构建路径,我应该有一个源路径。我已阅读大量制作手册以尝试找到解决方案,但没有运气。 对解决方案的任何帮助表示赞赏! 杰克

【问题讨论】:

标签: c++ makefile


【解决方案1】:

根据个人经验,在玩了一些“原始”Makefile 之后,我真的建议使用一些工具为您构建 Makefile,例如 automakecmake

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

【讨论】:

    【解决方案2】:

    我更喜欢的一个选项是在构建目录中构建同构目录结构。也就是说,源文件${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 会在目标目录不存在时自动创建它,而不是推测性地尝试为每个目录创建它们目标对象文件,即使它已经存在。

    【讨论】:

    • 仅供参考,您通常不应该让目标依赖于目录。如果您真的想这样做,请将该目录设置为仅订购的先决条件,而不是正常的先决条件(注意这是 GNU 仅生成功能)。
    • @MadScientist 在目录中添加/删除文件会更新目录的时间戳,而我们只关心它是否存在。因此,正如您正确指出的那样,仅订单依赖项应用于目录。
    • 好的,这绝对有帮助,我的大部分文件现在都可以使用命令 ${obj_dir}/%.o : ${src_dir}/%.cxx 来制作。现在的问题是我还有一些文件想要以 ${obj_dir}/%.o 文件结尾但不在 src_dir 中,它们位于单独的 src 目录中。此外,我还有一些 fortran 文件也需要编译,而 ${obj_dir}/%.o : ${src_dir}/%.cxx 规则不包括它们?
    • @JackMedley 如果您在${src_dir} 之外的目录中有源文件,您可以在${src_dir} 下对这些目录进行符号链接或添加另一个规则${obj_dir}/%.o : ${another_src_dir}/%.cxx
    猜你喜欢
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多