提问人:Dominic Sesto 提问时间:10/31/2023 更新时间:10/31/2023 访问量:54
CMake 库目标、单个目录中的公共和专用标头
CMake Library Target, Public and Private Headers in Single Directory
问:
假设我有以下项目结构(继承的代码 - 无法更改结构):
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
答:
2赞
Marek R
10/31/2023
#1
CMakeLists.txt 中的以下语句:
target_include_directories(MyLibrary PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
方法:
MyLibrary
target 或任何目标链接目标都应使用目录作为包含路径(因为使用了关键字)。( 意味着只应该使用这个包含路径,只有那些链接目标的人)。MyLibrary
MyProject/include
PUBLIC
PRIVATE
MyLibrary
INTERFACE
MyLibrary
因此,其他目标将能够包含您的专用标头。如果有人将您的整个项目包含在他的源代码中,就会发生这种情况。如果有人只安装库,公共标头将被复制到相应的位置,而没有私有标头。
解决此问题的最佳方法是将私有标头移动到目录。您不必更改任何其他内容。Src
注意好的库应该包含测试。这些测试不应使用私有标头来检查没有私有标头的一切是否正常工作。现在,您的测试将隐式看到私有标头,因此您可能会错过公共标头中正在使用某些私有符号。
评论