【问题标题】:(c)make - resursive compile(c)make - 递归编译
【发布时间】:2010-12-19 06:43:10
【问题描述】:

假设我有这样的目录:

dir1
    main.cpp
    dir2
        abc.cpp
    dir3
        def.cpp
        dir4
            ghi.cpp
            jkl.cpp

假设main.cpp包含dir2/abc.cpp和dir3/def.cpp,def.cpp包含dir4/ghi.cpp和dir4/jkl.cpp。

我的问题是,我怎样才能在 dir1/ 中有 一个 Makefile/CMakeLists.txt,它递归地进入每个目录并编译 *.cpp,然后“加入”它们?

对不起我的英语,希望我能很好地解释我的问题!

谢谢!

【问题讨论】:

  • 你的意思是 main.cpp 执行 '#include dir2/abc.cpp' 吗?如果是这样,那就停止这样做。
  • 不,我正在做#include "dir2/abc.h",它当然存在,但我认为这在这个问题中并不重要......

标签: c++ recursion makefile compilation cmake


【解决方案1】:

对于 makefile,dir1/Makefile 应该:

  • 声明 main.o 依赖于 dir2/abc.o 和 dir3/def.o
  • 声明如何创建dir2/abc.o和dir3/def.o

对于 cmake,它会“自动”检测此类依赖项(二进制文件依赖于 dir2/abc.o 和 dir3/def.o),因此实际上您不需要关心它。

【讨论】:

  • 我在想没有指定什么是依赖项,所以 cmake 是我的选择......但是,在问这个问题之前,我在互联网上搜索如何制作这个(因为我完全cmake 中的新功能),但可以找到任何东西......你能帮帮我吗? :)
  • 很遗憾文档不是很好,没有足够的例子。我建议你试着做一个小演示来调查它。例如,根据我的经验,我知道,当我开始编译创建可执行文件的目录时,cmake 首先编译包含二进制文件应该首先编译的库的其他目录
【解决方案2】:

一个 CMakeLists.txt 文件:

file(GLOB_RECURSE MAIN_SOURCES "dir1/*.cpp")

add_executable(MainExecutable ${MAIN_SOURCES})
# or
add_library(MyLibrary ${MAIN_SOURCES})

我不确定您所说的“加入”来源是什么意思。我在这里假设您将它们组合成一个库或一个可执行文件。

【讨论】:

    【解决方案3】:

    递归 make 是否是一件好事尚有争议。请参阅this blog entry 了解相对最新的赞成和反对论文的调查。

    【讨论】:

    • 我需要这个,因为我正在制作用户应该能够添加代码的项目,并且我想避免编辑 Makefile...
    猜你喜欢
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2017-01-31
    • 2014-04-28
    相关资源
    最近更新 更多