CMake库依赖项

时间:2017-02-10 18:58:16

标签: c++ cmake

这可能有点难以解释。我已经为我正在编写的一系列C ++库设置了一个目录结构。我打算用CMake来处理这些库的构建。在大多数情况下,这些库是完全独立的“子系统”,但在奇怪的地方,一个库需要访问另一个库中包含的头文件。这是我的目录结构。

base
 ├─ cmake
 ├─ docs
 ├─ examples
 └─ sources
    ├─ libA
    │   ├─ include
    │   │   └─ libA
    │   │       ├─ core.h
    │   │       └─ *.h
    │   ├─ source
    │   │   └─*.cpp
    └─ libB
        ├─ include
        │   └─ libB
        │       ├─ message.h
        │       └─ *.h
        └─ source
            └─ *.cpp

在一些地方有CMakeLists.txt个文件。主要的是在根目录base内,它设置了一堆变量和选项,最后调用add_subdirectory(sources)。在sources CMakeLists.txt文件中,只需调用:

add_subdirectory(libA)
add_subdirectory(libB)

最后,CMakeLists.txtlibA目录中都有libB个文件。除目标名称外,它们大致相同。其中一个文件的示例是:

set(target libA)

# Sources
set(include_path "${CMAKE_CURRENT_SOURCE_DIR}/include/${target}")
set(source_path  "${CMAKE_CURRENT_SOURCE_DIR}/source")

# Add include directories
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")

# Set the source files to compile
file(GLOB_RECURSE sources ${source_path}/**/*.cpp)

# Build library
add_library(${target} ${sources})

现在可以单独构建这两个库,但我需要能够在libA

中的源文件中包含来自libB的标头
// base/sources/libB/source/message.cpp

#include <ctime>
#include <iostream>

#include <libA/core.h>
#include <libB/message.h>

但是当我构建它时,我收到以下错误:

fatal error: 'libA/core.h' file not found

我尝试过使用target_link_librariestarget_include_directories而没有任何运气。显然我使用这些错误或根本不明白这些做了什么。

2 个答案:

答案 0 :(得分:5)

由于您的资源库libB需要libA的标题进行编译,因此我们说libAlibB的依赖关系。幸运的是,CMake在处理依赖关系时非常聪明,所以你的工作非常简单:

利巴

而不是

# Add include directories
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")

添加到最后

target_include_directories(${target} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")

这将告诉CMake它还必须将libA的标题包含到需要它的其他项目中。

libB

告诉CMake libB需要libA:

target_link_libraries(${target} libA)

请注意,编译时,这与链接步骤没有直接关系。对于库,它主要告诉它存在这种依赖关系,在这种情况下,它会自动为头自动添加路径。

答案 1 :(得分:2)

您可以为CMakeLists.txt libB添加另一个包含目录:

include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../libA/include")
相关问题