【问题标题】:CMake - Visual Studio project dependenciesCMake - Visual Studio 项目依赖项
【发布时间】:2014-02-04 09:19:26
【问题描述】:

几句话

我的问题是:有没有办法生成包含我正在为其编写 CMake 的项目和另一个项目(CMake 已经可用)的 Visual Studio 解决方案?

我在考虑使用add_subdirectory,但我不确定这是最好的解决方案,而且参数binary_dir 的含义对我来说不是很清楚。

更多细节

我有一个依赖于另一个 (A) 的 Visual Studio 项目 (B)。 我已经为 A 编写了 CMakeLists,并且能够生成 VS 项目并进行编译。

我已经为 B 编写了一个 CMakeLists。我能够为 B 配置 VS 项目,使其可以访问 A 的标头和库。一切都可以编译。

A
- CMakeLists.txt
- src
  - *.cpp

B 
- CMakeLists.txt
- src
  - *.cpp

Build
- Build_A
- Build_B

但是,当我从 B 项目中更改 A 中的某些内容时(这是可能的,因为使用 Visual Studio,我可以从项目 B 访问 A 的标头),并且我尝试编译,A 没有被编译。

项目B只编译B。

我可以通过使用add_subdirectory 来改善这种情况。在 B 的 CMakeLists 中,我包含以下行:

add_subdirectory(PATH_TO_A  A)

但是,使用此解决方案时,A 的编译文件存在重复。当我从项目 A 编译时,它们是在源外构建目录 BUILD_A 中生成的;当我从项目 B 编译时,它们是在源外构建目录BUILD_B\A 中生成的。

在从 B 的 CMakeLists 生成的解决方案中包含 A 项目并避免重复编译文件的最佳做法是什么?

附: 如果可能的话,我想避免重新编译所有内容两次。也就是说,如果我已经编译了A并且我需要第一次编译B,我想避免重新编译A的需要。

【问题讨论】:

    标签: visual-studio visual-studio-2012 cmake


    【解决方案1】:

    原则上使用add_subdirectory 是解决这个问题的好方法。

    如果遵循一些规则,可以自行编译的 CMake 项目也可以编译为子项目。首先,对全局状态的任何更改当然也会影响从同一根目录构建的所有其他项目。对全局构建环境进行激进的更改可能会干扰其他项目,应该避免。

    此外,像这样被拉入的项目不得假定其 CMakeLists 文件是构建的根目录。例如,CMAKE_BINARY_DIR 变量始终指向顶级二进制目录,而PROJECT_BINARY_DIR 指向最新项目的二进制目录。一个总是假设它被构建为顶级二进制文件的库可以互换使用这两者。既可以单独构建也可以作为子项目构建的库必须意识到差异。

    请注意,add_subdirectory 引入了项目之间的紧密耦合,并且只有在两个相关项目的行为都相应时才能正常工作。

    一个更松散耦合的替代方法是将依赖项包含为ExternalProject,但根据您在问题中所写的内容(如果依赖项的源发生更改,项目应自动重新编译),add_subdirectory 似乎更适合您.

    【讨论】:

    • 谢谢,这行得通。但是我有一个问题。我为A定义了一个源外构建文件夹,为B定义了另一个。在B的构建文件夹中,现在有一个新目录(对应于我给命令binary_dir的参数binary_dir命名的名称@ )。现在,如果从项目 A 编译,则在 A 的构建目录中生成发布文件夹。但是,如果我从项目 B 编译,则在 B 的构建目录中包含的binary_dir 中生成发布文件夹。基本上我会想避免这种编译文件的重复。这可能吗?
    • @Maverik 这是权衡:如果您单独编译,您将获得两次文件。理论上,您可以合并两个构建的二进制输出目录,但我不建议这样做。如果您只想要文件一次,请拆分项目并将依赖项包含为外部项目或导入目标,但不要以源形式。
    • 拆分项目是什么意思?将它们放在两个单独的解决方案中?实际上我想有一个项目 A 的解决方案,以及另一个项目 A 和 B 的解决方案。或者,我如何导入目标?谢谢!
    • @Maverik 如果您有一个完整的子项目(也可以独立构建,具有自己的project 调用)作为主项目目录树的一部分,并使用@987654331 将其拉入@ 默认情况下,您将在二进制目录的子目录中获得该项目的单独解决方案(即,除非手动指定二进制目录)。这两个解决方案共享各自子项目的输出目录,因此没有文件重复。如果您以另一种(非分层)方式组织您的解决方案,如果不手动摆弄二进制目录,这将不再有效。
    猜你喜欢
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    相关资源
    最近更新 更多