Qt Creator中CMake项目相对包含根目录的配置问题
问题情况
我有个用CMake构建的C++项目,上游最近重构代码,把大部分自有代码移到了subdir子目录里——比如原来的foo/foo_base.hpp现在路径是subdir/foo/foo_base.hpp。但第三方依赖的deps目录还留在项目根目录,没动。#include指令没改,还是用#include "foo/foo_base.hpp",CMakeLists.txt已经更新过,项目能正常构建。但Qt Creator没法解析移动后文件的依赖:比如subdir/bar/bar.cpp里引foo/foo_base.hpp,编辑器会提示文件找不到,跳转声明这类代码分析功能也用不了。
项目是通过Qt Creator的「新建项目>导入项目>导入现有项目」进来的,不是QMake项目,没有.pro文件。之前试着按Qt文档说的改.includes文件,加了subdir之后Qt Creator一打开就崩溃。
解决办法
1. 给CMake明确加包含目录(推荐)
既然CMake能正常构建,说明已经有相关配置,但Qt Creator的代码分析依赖CMake导出的索引信息,得确保CMake里把subdir明确设为包含目录:
在根目录的CMakeLists.txt里加:
# 传统写法 include_directories(${PROJECT_SOURCE_DIR}/subdir) include_directories(${PROJECT_SOURCE_DIR}/deps)
或者用现代CMake更规范的写法(针对具体目标):
target_include_directories(你的目标名称 PRIVATE ${PROJECT_SOURCE_DIR}/subdir ${PROJECT_SOURCE_DIR}/deps )
改完之后,在Qt Creator里点「项目>构建>重新运行CMake」,让它重新生成索引。
2. 直接在Qt Creator里配置代码模型的包含路径
不想改CMake的话,直接在Qt Creator里设置:
- 打开项目,点左侧的「项目」面板
- 切到「C++>代码模型」标签页
- 在「额外的包含目录」里加
${PROJECT_DIR}/subdir - 点「应用配置」,然后要么重启Qt Creator,要么点「工具>C++>重新解析当前项目」
3. 修复.includes文件(如果之前改崩了)
之前改.includes崩溃大概率是格式错了,试试这么弄:
- 先关掉Qt Creator,找到项目目录下
.qtcreator文件夹里的.includes文件 - 清空里面的内容,逐行写绝对路径:
/你的项目绝对路径/subdir /你的项目绝对路径/deps - 保存后再打开Qt Creator看看还崩不崩
验证
改完之后打开subdir/bar/bar.cpp,看看#include "foo/foo_base.hpp"的错误提示有没有消失,再试试Ctrl+左键跳转声明,确认功能正常。
内容的提问来源于stack exchange,提问作者user149408

