包括主项目中的第二个cmake项目

时间:2017-06-14 10:21:40

标签: cmake

我的目录布局如下

projectA/
|-- CMakeLists.txt
|-- src/
    |-- main.cpp
projectB/
|-- CMakeLists.txt
|-- src/
    |-- file1.cpp
    |-- file1.hpp
    |-- file2.hpp
    |-- main.cpp
|-- third_party/
    |-- include
        |-- lib1

我可以为projectAprojectB构建我的代码(单独),就好了,即两个项目都是自己运行的,彼此独立。

现在,在projectA我需要使用projectB中存在的代码(特别是file1.cppfile1.hppfile2.hpp和第三方库。

projectB/src复制必要的文件,将其粘贴到src的{​​{1}}目录并调整projectA CMakeLists.txt似乎是不好的做法相应地(通过部分合并projectAprojectB/CMakeLists.txt)。

我是否有一种很好的方式可以使用CMake(现在我不确定正确的术语)包括projectA/CMakeLists.txtprojectB/CMakeLists.txt定义的项目。我的想法是projectA/CMakeLists.txt中有关projectB独立运行的所有内容都在projectB/CMakeLists.txt中说明,如果我想在projectA中使用它,我应该无法访问此信息吗?

这可能是一个常见的问题,但我没有在网上找到任何有用的信息,也可能是因为手边没有正确的术语。

2 个答案:

答案 0 :(得分:0)

您必须决定所需的封装级别。

  1. 包:如果依赖项ProjectB可以独立运行而您只需要它的编译库,那么使用CMake的打包系统,即export(TARGETS)export(EXPORT)或{{ 1}}或export(PACKAGE)
  2. add_subdirectory :如果依赖项ProjectB也有您需要的构建目标信息,例如:编译定义,标志和其他依赖项,然后你可以创建一个顶级的CMakeLists并使用install(EXPORT)
  3. include:如果依赖项ProjectB只有您需要的子目标属性(包括源代码),您可以add_subdirectory() include(),但这实际上是为子目录和您不想更改CMake处理的现有当前目录
  4. 接口库:如果您的第三方库不是仅限标题,那么它们应该是独立的包,否则假设它们不像Boost那么大,您可以将它们复制到ProjectA。类似Boost的依赖项应该几乎总是保留在项目外部
  5. 硬编码路径:您可以硬编码到projectB的各个文件的路径,但这很脆弱而不会成为projectA的子目录,而这反过来会提供更好的解决方案,如上所述
  6. 重构到第三个库:如果以上都不适合,您可以将特定文件重构为单独的库,并使用标准打包机制来依赖它来同时支持ProjectA和ProjectB。 / LI>

答案 1 :(得分:0)

您可以使用ExternalProject模块 https://cmake.org/cmake/help/v3.7/module/ExternalProject.html

假设,projectB是库。然后:

project("A")
include(ExternalProject)

ExternalProject_Add(b_lib
      SOURCE_DIR "${B_SOURCE_DIR}" 
      BINARY_DIR "${B_BUILD_DIR}"
      CMAKE_ARGS "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
                 "-DCMAKE_INSTALL_PREFIX=${B_INSTALL_DIR}" 
                 "-DARBITRARY_VAR=some_value")

add_executable(a_exe src/main.cpp)
target_include_directories(a_exe PRIVATE "${B_INSTALL_DIR}")
target_link_libraries(a_exe "${B_INSTALL_DIR}/b_lib")