CMake - Visual Studio项目依赖项

时间:2014-02-04 09:19:27

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

简言之

我的问题是:有没有办法生成包含项目的visual studio解决方案,我正在编写CMake,另一个项目,CMake已经可用了?

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

更多细节

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

我为B编写了一个CMakeLists。我能够以这样一种方式为B配置VS项目,它可以访问A. Everything编译的头文件和库。

A
- CMakeLists.txt
- src
  - *.cpp

B 
- CMakeLists.txt
- src
  - *.cpp

Build
- Build_A
- Build_B

然而,当我在A项中更改某些内容时,从B项目(这可能是因为使用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项目并避免重复编译文件的最佳做法是什么?

P.S。 如果可能的话,我想避免重新编译所有内容两次。也就是说,如果我编译了A并且我需要第一次编译B,我希望避免重新编译A。

1 个答案:

答案 0 :(得分:3)

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

如果CMake项目遵循一些规则,则可以将其自身编译的项目编译为子项目。首先,对全局状态的任何更改当然也会影响从同一个根构建的所有其他项目。对全球构建环境的积极变化可能会扰乱其他项目,应该避免。

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

请注意add_subdirectory引入了项目之间的紧密耦合,只有当两个涉及的项目都相应地表现时才能正常工作。

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