CMake使用include_directory添加路径时如何排除不需要的目录?
可行解决方案
方案1:直接指定需要引入的目录(优先推荐)
无需引入整个app根目录,直接将你实际用到的头文件目录加入搜索路径即可,从根源避免引入无关目录:
include_directories(app/appSrc)
该方案下build、compile、docs等目录完全不会被纳入头文件搜索范围,IDE也不会对这些目录做额外扫描,不会影响自动补全效率。
方案2:必须保留根目录引入时的适配方案
如果项目中已经大量使用不带appSrc前缀的头文件引用,修改引用成本过高,必须保留include_directories(app)的配置,可以通过属性设置屏蔽无关目录的IDE扫描:
- 对CMake 3.18及以上版本,可以给无关目录设置
EXCLUDE_FROM_INDEX属性,主流IDE(CLion、Qt Creator等)识别到该属性后不会将目录纳入索引扫描范围:set_property(DIRECTORY app/build PROPERTY EXCLUDE_FROM_INDEX TRUE) set_property(DIRECTORY app/compile PROPERTY EXCLUDE_FROM_INDEX TRUE) set_property(DIRECTORY app/docs PROPERTY EXCLUDE_FROM_INDEX TRUE) - 对旧版本CMake或者不支持上述属性的IDE,可以将无关目录标记为二进制输出目录,绝大多数IDE默认不会扫描二进制目录的头文件:
set_property(DIRECTORY app/build PROPERTY BINARY_DIR ON) set_property(DIRECTORY app/compile PROPERTY BINARY_DIR ON)
方案3:动态过滤生成合法搜索路径
如果需要批量引入appSrc下的多层子目录,可以用文件搜索逻辑过滤掉无关目录后批量添加:
# 搜索app下所有子目录,过滤掉无关目录 file(GLOB_RECURSE ALL_SUBDIRS LIST_DIRECTORIES true app/*) set(VALID_INCLUDE_DIRS "") foreach(DIR ${ALL_SUBDIRS}) if(IS_DIRECTORY ${DIR} AND NOT DIR MATCHES "app/(build|compile|docs)(/.*)?$") list(APPEND VALID_INCLUDE_DIRS ${DIR}) endif() endforeach() include_directories(${VALID_INCLUDE_DIRS})
注意该方案在目录结构发生变动时,需要重新运行CMake才能生效。
内容的提问来源于stack exchange,提问作者Dariusz
相关产品推荐
相关产品推荐

