我非常深入地研究了CMake PUBLIC,PRIVATE,INTERFACE。根据文档,当你想让你的库为依赖于库的库提供接口包含时,应该使用包含路径的 INTERFACE,但是库内的源代码不会看到这些包含。
我的磁盘组织如下:
- mylib
- src
- include/mylib/mylib.h
- mylib/mylib.c
- CMakeLists.txt
在CMakeLists.txt
中,我有:
cmake_minimum_required(VERSION 3.22)
add_library(mylib INTERFACE)
target_sources(mylib PUBLIC ${CMAKE_CURRENT_LIST_DIR}/src/mylib/mylib.c)
target_include_directories(mylib INTERFACE ${CMAKE_CURRENT_LIST_DIR}/src/include)
我的目标包括 mylib,比如:
add_subdirectory("middlewares/mylib" mylib)
target_link_libraries(${CMAKE_PROJECT_NAME} mylib)
它编译。库中的mylib.c
可以看到包含路径mylib.h
,即使这个路径被定义为INTERFACE,根据CMake,它不应该是可见的。
- 它为什么会起作用?
- 因为library是一个单头的,而且依赖于它的lib也需要它的头,我应该使用 PUBLIC 吗?
1条答案
按热度按时间x0fgdtte1#
编译
mylib.c
的是目标${CMAKE_PROJECT_NAME}
,而不是mylib
。mylib
是一个INTERFACE
库,它根本没有引入任何构建步骤,只是一个附加信息的库。在这种情况下,随附的相关信息为:1.要添加到链接目标的源文件(
target_sources(... PUBLIC ...)
)1.包含目录(
target_include_directories(... INTERFACE ...)
)因此,这两条必要的信息都应用于
${CMAKE_PROJECT_NAME}
,编译工作“出乎意料”。