CMAKE 保留标头包含的目录路径,来自仅标头构建的库

CMAKE retain dir path for header includes from a header only built library

提问人:0x52616A657368 提问时间:10/19/2021 更新时间:10/19/2021 访问量:57

问:

我正在尝试通过将所有标头放在一个单独的 cmake 标头项目中来重组我的 CMAKE 项目,并使用 target_link_libraries 将其添加到我的源 cmake 项目中。

是否可以在 cpp 源文件中包含标题时保留文件夹路径。

接口库中的头文件也应该能够使用头文件文件夹名称从不同目录(在同一 cmake 接口项目中)访问其他头文件。

预期

#include "A/A.hpp"
#include "AGen/AGen.hpp"
#include "json/json.hpp"

当前工作 IMPL

#include "A.hpp"
#include "AGen.hpp"
#include "json.hpp"

我的接口 CMake 配置

    set(project_includes_internal
    ${CMAKE_CURRENT_LIST_DIR}/A
    ${CMAKE_CURRENT_LIST_DIR}/B
    ${CMAKE_CURRENT_LIST_DIR}/C
    )
    
    set(project_gen_includes
    ${CMAKE_CURRENT_BINARY_DIR}/include/AGen
    ${CMAKE_CURRENT_BINARY_DIR}/include/BGen
    ${CMAKE_CURRENT_BINARY_DIR}/include/CGen
    )
    
    set(project_dep_inludes
    ${CMAKE_HOME_DIRECTORY}/dep/nlohmann/json
    )
set(PROJECT_INCLUDES
        ${project_includes_internal}
        ${project_gen_includes}
        ${project_dep_inludes})

add_library(${PROJECT_NAME} INTERFACE)
target_include_directories(${PROJECT_NAME}
        INTERFACE
        $<BUILD_INTERFACE:${PROJECT_INCLUDES}>
        $<INSTALL_INTERFACE:include>
        )

我的来源 cmake 配置

add_executable(${PROJECT_NAME}-bin ${PROJECT_TARGET_SOURCES})
target_link_libraries(${PROJECT_NAME}-bin
        PUBLIC
        ${ACTIVATION_PROJECT_INCLUDES_NAME})

此外,还可以将所有必需的包含文件复制到构建目录中,以便在其他计算机上安装时可以复制/发布这些文件。

C++ CMake 仅标头

评论

0赞 pptaszni 10/19/2021
我不明白这里有什么问题。如果需要,请添加目录而不是 .此外,“内部”表明这些标头应该只在实现时可见,那么为什么要将它们添加到接口中呢?#include "AGen/AGen.hpp"includetarget_include_directoriesinclude/AGen
0赞 0x52616A657368 10/20/2021
@pptaszni不确定“内部建议这些标头应该仅通过实现可见,那么为什么要将它们添加到界面中”的确切含义? 基本上,我正在尝试创建一个仅标头库并将其添加为目标,而不是在源 cmake 文件中列出标头
0赞 pptaszni 10/20/2021
为什么要调用第一个标头集合?我虽然因为它们是内部实现细节,我想建议不要将它们包含在界面中。否则,您显示的所有内容都是正确的。您是否遇到过在代码中包含标头的问题?你的(有点简化的)例子对我有用。project_includes_internal

答: 暂无答案