CMake 库目标、单个目录中的公共和专用标头

CMake Library Target, Public and Private Headers in Single Directory

提问人:Dominic Sesto 提问时间:10/31/2023 更新时间:10/31/2023 访问量:54

问:

假设我有以下项目结构(继承的代码 - 无法更改结构):

MyProject
├── CMakeLists.txt
├── src
│   └── foo.cpp
│   └── bar.cpp
├── include
│   └── foo_public.h
│   └── foo_private.h
│   └── bar_public.h
│   └── bar_private.h

CMakeLists.txt:

cmake_minimum_required(VERSION 3.16)
project(MyProject)

add_library(MyLibrary
    foo.cpp
    bar.cpp)

target_include_directories(MyLibrary PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

set_target_properties(MyLibrary PROPERTIES PUBLIC_HEADER foo_public.h bar_public.h)

install(TARGETS MyLibrary
        LIBRARY DESTINATION ${INSTALL_LOCATION}/lib
        PUBLIC_HEADER DESTINATION ${INSTALL_LOCATION}/include)

这是否允许其他可执行文件/库链接到安装位置,而无需查看私有头文件?MyLibrary

公共标头和私有标头都位于传递到的同一位置有关系吗?target_include_directories

注意:目标环境是 Red Hat Enterprise Linux

C++ CMake 链接器 私有

评论


答:

2赞 Marek R 10/31/2023 #1

CMakeLists.txt 中的以下语句:

target_include_directories(MyLibrary PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

方法:

  • MyLibrarytarget 或任何目标链接目标都应使用目录作为包含路径(因为使用了关键字)。( 意味着只应该使用这个包含路径,只有那些链接目标的人)。MyLibraryMyProject/includePUBLICPRIVATEMyLibraryINTERFACEMyLibrary

因此,其他目标将能够包含您的专用标头。如果有人将您的整个项目包含在他的源代码中,就会发生这种情况。如果有人只安装库,公共标头将被复制到相应的位置,而没有私有标头。

解决此问题的最佳方法是将私有标头移动到目录。您不必更改任何其他内容。Src

注意好的库应该包含测试。这些测试不应使用私有标头来检查没有私有标头的一切是否正常工作。现在,您的测试将隐式看到私有标头,因此您可能会错过公共标头中正在使用某些私有符号。

我建议查看此说明,什么是组织库项目的最佳实践。它包含许多不错的技术细节。这里是 github 项目