QtCreator Build/Clean 究竟做了啥?
Posted
技术标签:
【中文标题】QtCreator Build/Clean 究竟做了啥?【英文标题】:What exactly QtCreator Build/Clean makes?QtCreator Build/Clean 究竟做了什么? 【发布时间】:2016-12-16 13:17:17 【问题描述】:我正在使用带有 CMake 的 QtCreator。在我的 CMakeLists.txt 文件中,我使用 GLOB_RECURSE QOBJECT_SOURCES "*.cpp"
,只是为了避免在添加新源时编辑文件。当然,那时 CMake 并没有改变它应该编译的可用文件的想法。我希望如果我使用 Build/Clean,它会清理缓存,当我重新编译项目时,会找到我的新源文件。但是,QtCreator 忽略了新添加的文件。我需要手动清理构建目录,然后运行cmake ..; make
。那么,Build/Clean 究竟做了什么,与 Build/Rebuild 有什么区别? QtCreator 中有什么东西,我可以让编译器知道我的新文件吗?
【问题讨论】:
【参考方案1】:一按“Build > Clear CMake Configuration”,Build目录下的文件CMakeCache.txt
和目录CMakeFiles
被删除:
https://github.com/qtproject/qt-creator/blob/master/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp
m_clearCMakeCacheAction [...] "Clear CMake Configuration"
[...]
connect(m_clearCMakeCacheAction [...] clearCMakeCache(SessionManager::startupProject());
https://github.com/qtproject/qt-creator/blob/master/src/plugins/cmakeprojectmanager/builddirmanager.cpp
void BuildDirManager::clearCache()
auto cmakeCache = Utils::FileName(workDirectory()).appendPath(QLatin1String("CMakeCache.txt"));
auto cmakeFiles = Utils::FileName(workDirectory()).appendPath(QLatin1String("CMakeFiles"));
const bool mustCleanUp = cmakeCache.exists() || cmakeFiles.exists();
if (!mustCleanUp)
return;
Utils::FileUtils::removeRecursively(cmakeCache);
Utils::FileUtils::removeRecursively(cmakeFiles);
forceReparse();
您使用的是什么版本的 QtCreator 和 CMake?
我怀疑您描述的行为是 QtCreator 4.1 之前的行为(或者至少我记得在我跳到版本 4.1 之前发生了类似的事情,可在 QtCreator snapshots 获得)。
以防万一,您应该尝试最新的,看看是否能解决您的问题,因为我使用的是 QtCreator 4.2 和 CMake 3.7(以及之前的 QtCreator 4.1 和 Cmake 3.5),我看不到您描述的内容。
我像你一样设置文件(尽管 CMake 开发人员不推荐它)。我的意思是,在 CMakeList.txt 中,我主要添加一个 GLOB
(如果我想递归扫描指向的目录,则添加 GLOB_RECURSE
)。
这样,在这些目录中创建一个新文件后,在 Qt Creator 中只需要推送“Build > Run CMake”,或者在编辑器中修改 CMakeList.txt 并使用空格加上 CTRL+S(如果有已在“选项 > 构建和运行 > CMake”处激活“自动运行 CMake”)。这两个操作都使用新文件更新列出的文件树,为构建和运行 (CTRL+R) 做好准备。
从我谦虚的角度来看,我认为当一个人在新项目中不断创建和重命名文件时,这是一种更舒适的方式(在我的情况下,我还添加了 *.h
和 *.hpp
,以便能够看到这些项目中列出的文件)。
【讨论】:
【参考方案2】:这就是 CMake 的 file(GLOB ...)
的问题:它只在 CMake 运行时评估,而不是在 make 运行时评估。
QtCreator 的构建依赖于 make 检测更改的能力,当它检测到 CMakeLists.txt 文件的更改时将调用 CMake。
最可靠且推荐的方式是手动显式命名和列出所有源文件和头文件。
【讨论】:
你是对的,这个信息已经出现在我的问题中。我预计 QtCreator Build/Clear 会让“检测更改”,但事实并非如此。有什么用?以上是关于QtCreator Build/Clean 究竟做了啥?的主要内容,如果未能解决你的问题,请参考以下文章