cmake依赖问题

时间:2009-12-15 19:28:47

标签: cmake

我有3个小的依赖工具:

main-tool/
    tool1/
    tool2/ 

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

主要工具依赖于tool1& TOOL2。
tool1依赖于tool2 CMakeFiles看起来像这样:

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

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

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

感谢。

2 个答案:

答案 0 :(得分:3)

首先,您应该使用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 build中填充这些变量。您可能需要将PARENT_SCOPE指令用于set来自tool2子目录的变量。然后使用这些变量从tool1子目录访问tool2。
  2. 或者,您可以从顶级CMakeLists文件构建所有三个工具(tool2,tool1和main工具,按此顺序)。构建文件可能会变长,但它会避免尝试管理cmake变量范围的麻烦。这是我经常采用的方法,我推荐它。
  3. 总结一下,我的建议是“一个大的CMakeLists.txt文件”。除非真的变得非常大。

答案 1 :(得分:0)

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