如何在CMake中正确创建目标之间的依赖关系?

时间:2011-02-05 04:12:55

标签: c++ build cmake

我正在尝试使用CMake在C ++项目和它使用的库之间建立一些简单的依赖关系。

设置如下

  • 项目
    • 依赖

项目本身包含包含来自Dependency的标头的源文件,当构建可执行文件时,它需要与Dependency的静态库链接。

到目前为止,我可以使用此功能,但我必须手动在Dependency文件的CMakeLists.txt文件中指定Project的包含目录。我希望自动将其拉出来,并且我已经探索了使用find_package()命令的选项,但只取得了有限的成功并使事情变得更加复杂。

我想要做的就是在Dependency之前构建Project并且Project链接到库并拥有其包含目录。有没有简单明了的方法来实现这个目标?

我目前的CMake文件:

Project,档案CMakeLists.txt

cmake_minimum_required (VERSION 2.6)
project (Project)
include_directories ("${PROJECT_SOURCE_DIR}/Project")
add_subdirectory (Dependency)
add_executable (Project main.cpp)
target_link_libraries (Project Dependency)
add_dependencies(Project Dependency)

Dependency,档案CMakeLists.txt

project(Dependency)
add_library(Dependency SomethingToCompile.cpp)
target_link_libraries(Dependency)

2 个答案:

答案 0 :(得分:21)

CMake 2.8.11以来,您可以使用target_include_directories。只需在您的DEPENDENCY项目中添加此功能,并填写您希望在主项目中看到的目录。 CMake将关心其余部分。

PROJECT,CMakeLists.txt:

cmake_minimum_required (VERSION 2.8.11)
project (Project)
include_directories (Project)
add_subdirectory (Dependency)
add_executable (Project main.cpp)
target_link_libraries (Project Dependency)

依赖性,CMakeLists.txt

project (Dependency)
add_library (Dependency SomethingToCompile.cpp)
target_include_directories (Dependency PUBLIC include)

答案 1 :(得分:0)

目前还不清楚你想做什么,以及为什么必须单独构建Project和Depency。

我的第一个例子就是

  1. 在PROJECT中,CMakeLists.txt

    • 删除add_dependencies(项目依赖项) 没有必要指定依赖项,target_link_libraries()已经这样做了。
  2. 依赖,CMakeLists.txt

    • 删除项目(依赖项) 它构建了一个库,为什么要拥有自己的项目呢?
    • 删除target_link_libraries(依赖关系) 因为它什么都不做