首页 > 解决方案 > 在包含语句中为标题名称添加前缀的库名称

问题描述

我有一个包含嵌套库的 CMake 项目。“嵌套”是指它存在于这个项目源代码树中(libraries文件夹中)。这是这个库的文件结构:

$ tree ./libraries/SomeLibrary

├── CMakeLists.txt
├── include
│   └── some.h
└── src
    ├── some.cpp
    └── things.h

在那个库中,CMakeLists.txt我有以下包含路径、公共头文件和安装的语句:

set(target "SomeLibrary")

# ...

target_include_directories(${target}
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/src
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)

set(public_headers
    include/some.h
)
set_target_properties(${target} PROPERTIES PUBLIC_HEADER "${public_headers}")

# ...

install(TARGETS ${target}
    EXPORT "${target}Config"
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # lib
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} # lib
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # bin
    INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} # include
    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${target} # include/SomeLibrary
)
install(
    EXPORT "${target}Config"
    FILE "${target}Config.cmake"
    NAMESPACE some::
    DESTINATION cmake
)

现在,如果我从某个外部项目链接到这个库,那么我会包含这个库的标题,如下所示:

#include <SomeLibrary/some.h>

这很棒,正是我所期望的。但是,如果我target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE SomeLibrary)从我的基础项目(这个库所在的源树中)链接到这个库(),那么我需要包含这个库的标题,如下所示:

#include <some.h>

我可以以某种方式做到这一点,以便我也可以#include <SomeLibrary/some.h>用于这种“内部”链接吗?我想要它的原因是因为我相信它会帮助我避免可能的标题名称冲突(如果项目中的其他一些库也有一个名为的公共标题some.h)。

一种简单的解决方案是在其中创建SomeLibrary文件夹include并将公共标头放在那里。但我对这个选项并不完全满意,因为SomeLibrary/include/SomeLibrary看起来并不好。

现在可能有其他方式吗?

标签: c++cmake

解决方案


推荐阅读