假设我有下面的项目结构(继承的代码-不能改变结构):
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
1条答案
按热度按时间wtzytmuj1#
CMakeLists.txt中的此声明:
字符串
平均值:
MyLibrary
目标或任何目标链接目标MyLibrary
应该使用MyProject/include
目录作为包含路径(因为使用了PUBLIC
关键字).(PRIVATE
意味着只有MyLibrary
应该使用这个包含路径,INTERFACE
只有那些链接目标MyLibrary
的人).因此,其他目标将能够包含您的私有头。如果有人将您的整个项目包含到他的源代码中,就会发生这种情况。如果有人只安装库,公共头将被复制到相应的位置,而没有私有头。
解决这个问题的最好方法是将私有头文件移动到
Src
目录。您不必更改任何其他内容。注意好的库应该包含测试。这些测试不应该使用私有头来检查没有私有头的一切工作。现在你的测试将隐式地看到私有头,所以你可能会错过一些私有符号在公共头中使用。
我向see this instruction推荐什么是组织库项目的最佳实践。它包含了很多很好的技术细节。这里是github project。