c++ - CMake 不在子模块 B 中包含子模块 A 的头目录

标签 c++ cmake

我有一个如下所示的 CMake 项目:

project/
  CMakeLists.txt
  subprojectA/
    CMakeLists.txt
    include/
      headerA.hpp
    src/
      libraryA.cpp
  subprojectB/
    CMakeLists.txt
    src/
      mainB.cpp

“库”子项目 A 被编译为静态库,成为 libsubprojectA.a。 “主要”项目 B 被编译为二进制文件并依赖于库。 mainB.cpp 包含对 headerA.hpp 的引用。

这是子项目A/CMakeLists.txt:

project(SubProjectA)
include_directories(include)
add_library(subprojectA STATIC src/libraryA.cpp)
set(${PROJECT_NAME}_INCLUDE_DIRS
    ${PROJECT_SOURCE_DIR}/include
    CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE)

这是子项目 B/CMakeLists.txt:

project(SubProjectB)
include_directories(${SubProjectA_INCLUDE_DIRS})
add_executable(mainBinary src/mainB.cpp)
target_link_libraries(mainBinary subprojectA)

主要项目 CMakeLists.txt 如下所示:

project(Project)
add_subdirectory(subprojectB)
add_subdirectory(subprojectA)

请注意,主项目 subprojectB 在 subprojectA 之前列出。

问题来了。当我第一次在此项目上运行“cmake”时,${SubProjectA_INCLUDE_DIRS} 未在 SubProjectB 中设置。

我认为正在发生的事情是当 ${SubProjectA_INCLUDE_DIRS} 尚未设置时,首先加载 SubProjectB 的 CMakeLists。结果它将自己的包含路径设置为空字符串。然而,即使 libsubprojectA.amainBinary 之前成功构建,包含路径已经预先设置为空。结果,我在尝试制作 mainBinary 时遇到此错误:

subprojectB/src/mainB.cpp:1:23: fatal error: headerA.hpp: No such file or directory
#include "headerA.hpp"
                      ^

在 CMake 的声明世界中,在主项目 CMakeLists 中将 subprojectA 放在 subprojectB 之前是一种变通方法。我真正想要的是知道向 CMake 指示 include_directories(${SubProjectA_INCLUDE_DIRS})depends 存在于 SubProjectA 的 CMakeLists 中的定义的正确方法。有更好的方法吗?

最佳答案

如果您想表达包含目录 subprojectA/include 是库 subprojectA 的一个接口(interface),将此属性附加到目标target_include_directories命令:

子项目A/CMakeLists.txt:

project(SubProjectA)
add_library(subprojectA STATIC src/libraryA.cpp)
# PUBLIC adds both:
#     1) include directories for compile library and
#     2) include directories for library's interface
target_include_directories(subprojectA PUBLIC include)

因此,任何与 subprojectA 链接的可执行文件(或其他库)都将自动包含此包含目录:

子项目B/CMakeLists.txt:

project(SubProjectB)
add_executable(mainBinary src/mainB.cpp)
target_link_libraries(mainBinary subprojectA)

当然,为了正确使用最后一个命令,您需要在 具有可执行文件的目录之前处理带有库的目录:

CMakeLists.txt:

project(Project)
add_subdirectory(subprojectA)
add_subdirectory(subprojectB)

关于c++ - CMake 不在子模块 B 中包含子模块 A 的头目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38022700/

相关文章:

带有 Rcpp 和 CMake 的 R 包(Windows)

c++ - CMake 可以找到一个 Boost 头文件,但找不到另一个

cmake - 我该如何修复 "The CMAKE_C_COMPILER is not a full path and was not found in the PATH"?

c++ - 为每个 pthread 调用不同的函数

c++ - 为什么 std::accumulate 生成 705032704 作为输出而不是 vector 中元素的总和?

cmake - 配置 CLion、Cmake 和 SFML 的问题

macos - 体系结构 x86_64 : "_glBegin" 的 undefined symbol

c++ - OpenGL 组合旋转

c++ - GCC 和包含文件问题

c++ - 如何将数组传递给函数?使用 C++ 作为 OO 类