CMake疑问:INTERFACE包含路径为何能被库源文件识别?
问题解答
1. 为何当前写法能生效?
核心原因是你创建的mylib是INTERFACE库——这类库本质是接口集合,自身不会被单独编译,所有通过target_sources添加的源文件,都会直接附加到依赖它的主目标中,作为主目标的一部分完成编译。
当主目标链接mylib时,会自动继承mylib的INTERFACE包含路径,所以编译被附加进来的mylib.c时,自然能找到src/include下的头文件。这完全符合CMake规则:INTERFACE属性确实只提供给依赖目标,但这里mylib.c是在依赖目标的编译上下文里被处理的,而非mylib自身(它根本没有独立的编译过程)。
2. 是否应该改用PUBLIC属性?
要根据库的实际类型判断:
- 如果这是真正的单头文件库(只有
.h,无.c实现):当前INTERFACE库写法合理,但可以删掉target_sources行(无实现文件需要编译),仅保留target_include_directories(mylib INTERFACE ...)即可——INTERFACE属性就是为这种“仅传递接口给依赖”的场景设计的。 - 如果库包含
.c实现文件(如当前代码所示):不应使用INTERFACE库,要改用STATIC或SHARED库,此时target_include_directories的属性选择如下:
若库自身编译需要头文件路径,且依赖目标也需要该头文件(比如头文件对外暴露了API),直接用PUBLIC即可——它会同时作用于库自身的编译和依赖目标的接口继承。
正确写法示例:cmake_minimum_required(VERSION 3.22) add_library(mylib STATIC) target_sources(mylib PRIVATE ${CMAKE_CURRENT_LIST_DIR}/src/mylib/mylib.c) target_include_directories(mylib PUBLIC ${CMAKE_CURRENT_LIST_DIR}/src/include)
内容的提问来源于stack exchange,提问作者unalignedmemoryaccess
相关产品推荐
相关产品推荐

