这可能有点难以解释。我已经为我正在编写的一系列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.txt
和libA
目录中都有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_libraries
和target_include_directories
而没有任何运气。显然我使用这些错误或根本不明白这些做了什么。
答案 0 :(得分:5)
由于您的资源库libB
需要libA
的标题进行编译,因此我们说libA
是libB
的依赖关系。幸运的是,CMake在处理依赖关系时非常聪明,所以你的工作非常简单:
而不是
# Add include directories
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
添加到最后
target_include_directories(${target} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
这将告诉CMake它还必须将libA
的标题包含到需要它的其他项目中。
告诉CMake libB需要libA:
target_link_libraries(${target} libA)
请注意,编译时,这与链接步骤没有直接关系。对于库,它主要告诉它存在这种依赖关系,在这种情况下,它会自动为头自动添加路径。
答案 1 :(得分:2)
您可以为CMakeLists.txt
libB
添加另一个包含目录:
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../libA/include")