CMake:为什么源查找包含INTERFACE的路径?

xdyibdwo  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(102)

我非常深入地研究了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 吗?
x0fgdtte

x0fgdtte1#

编译mylib.c的是目标${CMAKE_PROJECT_NAME},而不是mylib
mylib是一个INTERFACE库,它根本没有引入任何构建步骤,只是一个附加信息的库。在这种情况下,随附的相关信息为:
1.要添加到链接目标的源文件(target_sources(... PUBLIC ...)
1.包含目录(target_include_directories(... INTERFACE ...)
因此,这两条必要的信息都应用于${CMAKE_PROJECT_NAME},编译工作“出乎意料”。

相关问题