【发布时间】:2017-02-10 18:58:15
【问题描述】:
这可能有点难以完整解释。我已经为我正在编写的一系列 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)
最后,libA 和 libB 目录中都有 CMakeLists.txt 文件。除了目标名称之外,这些都基本相同。这些文件之一的示例是:
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})
现在可以毫无问题地单独构建这两个库,但我需要能够在 libB 内的源文件中包含来自 libA 的标头
// 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_libraries 和target_include_directories,但没有任何运气。很明显,我用错了,或者根本不明白这些都是做什么的。
【问题讨论】: