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

rad*_*man 30 c++ build cmake

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

设置如下

  • 项目
    • 依赖

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

到目前为止,我能得到这个工作,但我必须指定包括目录DependencyCMakeLists.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)
Run Code Online (Sandbox Code Playgroud)

Dependency,档案CMakeLists.txt:

project(Dependency)
add_library(Dependency SomethingToCompile.cpp)
target_link_libraries(Dependency)
Run Code Online (Sandbox Code Playgroud)

dip*_*ipp 22

既然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)
Run Code Online (Sandbox Code Playgroud)

依赖性,CMakeLists.txt

project (Dependency)
add_library (Dependency SomethingToCompile.cpp)
target_include_directories (Dependency PUBLIC include)
Run Code Online (Sandbox Code Playgroud)


Vla*_*oub 2

目前尚不清楚您想要做什么,以及为什么Project必须Dependency单独构建。

我的第一个例子是

  1. PROJECTCMakeLists.txt:

    • 删除add_dependencies(Project Dependency) 无需指定依赖项,target_link_libraries()已经这样做了。
  2. DEPENDENCYCMakeLists.txt:

    • 删除 project(Dependency) 它构建了一个库,那么为什么要有自己的项目呢?
    • 删除target_link_libraries(Dependency) 因为它什么也不做

  • 回答你的问题。依赖项可能是作为 git 子模块包含的共享库的项目。共享库也可以在没有外部项目的情况下工作。 (7认同)