单个目录中的CMake库目标、公共和私有标头

xuo3flqw  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(111)

假设我有下面的项目结构(继承的代码-不能改变结构):

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,而看不到私有头文件?
public和private header是否位于传递给target_include_directories的同一位置?
注意:目标环境是Red Hat Enterprise Linux

wtzytmuj

wtzytmuj1#

CMakeLists.txt中的此声明:

target_include_directories(MyLibrary PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

字符串
平均值:

  • MyLibrary目标或任何目标链接目标MyLibrary应该使用MyProject/include目录作为包含路径(因为使用了PUBLIC关键字).(PRIVATE意味着只有MyLibrary应该使用这个包含路径,INTERFACE只有那些链接目标MyLibrary的人).

因此,其他目标将能够包含您的私有头。如果有人将您的整个项目包含到他的源代码中,就会发生这种情况。如果有人只安装库,公共头将被复制到相应的位置,而没有私有头。
解决这个问题的最好方法是将私有头文件移动到Src目录。您不必更改任何其他内容。
注意好的库应该包含测试。这些测试不应该使用私有头来检查没有私有头的一切工作。现在你的测试将隐式地看到私有头,所以你可能会错过一些私有符号在公共头中使用。
我向see this instruction推荐什么是组织库项目的最佳实践。它包含了很多很好的技术细节。这里是github project

相关问题