【问题标题】:cmake dependency problemcmake依赖问题
【发布时间】:2009-12-15 19:28:47
【问题描述】:

我有 3 个小的依赖工具:

main-tool/
    tool1/
    tool2/ 

       * ----- main-tool ----- *
       |                       |
      tool1   ---------- >    tool2

主工具依赖于工具1和工具2。
tool1 依赖于 tool2。
CMakeFiles 看起来像这样:

main-tool/CMakeLists.txt
   SUBDIRS{"tool1"}
   SUBDIRS{"tool2"}

main-tool/tool1/CMakeLists.txt
   SUBDIRS("../tool2"}

我可以顺利编译tool1。但是,每当我想编译 main-tool 时,都会包含两次 tool2 并产生错误。我怎样才能避免这种情况?

谢谢。

【问题讨论】:

  • 我解决了这个问题,方法是在 main-tool/CMakeLists.txt 中设置一个 VAR,然后在 tool1/CMakeLists.txt 中设置 IF 语句:IF (NOT DEFINED VAR) SUBDIR(../tool2) ENDIF (未定义的 VAR)。它有效,但晦涩难懂。
  • 如果您已经找到解决方案,也许您应该关闭问题

标签: cmake


【解决方案1】:

首先,您应该使用add_subdirectory() 而不是subdirs(),即deprecated。通过这种方式,您可以更精确地控制处理顺序。

其次,因为一切都依赖于tool2,所以你应该先构建tool2。

main-tool/CMakeLists.txt:
   add_subdirectory{"tool2"}
   add_subdirectory{"tool1"}

不要在 tool1 目录中添加另一个 add_subdirectory 命令。您可以使用两种方法从 tool1 构建访问 tool2。

  1. 首先,您可以在与 tool2 相关的顶级主 CMakeLists.txt 中定义一些 cmake 变量,然后在 tool2 构建中填充这些变量。您可能需要使用 PARENT_SCOPE 指令来set tool2 子目录中的这些变量。然后使用这些变量从 tool1 子目录访问 tool2。
  2. 或者,您可以从顶级 CMakeLists 文件构建所有三个工具(工具 2、工具 1 和主工具,按此顺序)。构建文件可能会很长,但它可以省去尝试管理 cmake 变量范围的麻烦。这是我通常采用的方法,我推荐它。

总而言之,我的建议是“一个大的 CMakeLists.txt 文件”。除非它变得非常非常大。

【讨论】:

  • 感谢 Christopher,我选择了 (1) 并使用了 configure_file()。我不知道 PARENT_SCOPE。这会很有帮助。
【解决方案2】:

你真的应该只对子目录使用SUBDIRS。你所说的依赖实际上是什么意思?如果您将一些库链接在一起使用TARGET_LINK_LIBRARIES,CMake 将在您的项目中找到它们,而不管目录。如果是运行时依赖,你通常只在安装后才关心它,或者你可以使用"${CMAKE_CURRENT_BINARY_DIR}/../tool2/tool2"作为二进制文件的路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2017-01-14
    • 1970-01-01
    相关资源
    最近更新 更多