QtCreator Build/Clean 究竟是做什么的?

What exactly QtCreator Build/Clean makes?

我正在使用带有 CMake 的 QtCreator。在我的 CMakeLists.txt 文件中,我使用 GLOB_RECURSE QOBJECT_SOURCES "*.cpp",只是为了避免在添加新源时编辑文件。那个时候 CMake 当然不会改变它应该编译的可用文件的想法。我预计如果我使用 Build/Clean,它会清理缓存,并且当我重新编译项目时,会找到我的新源文件。然而,QtCreator 忽略了新添加的文件。我需要手动清理构建目录,运行 cmake ..; make。那么,Build/Clean 到底是什么,与 Build/Rebuild 有什么区别? QtCreator 中有什么东西可以让编译器知道我的新文件吗?

这就是 CMake 的问题 file(GLOB ...):它仅在 CMake 为 运行 时进行评估,而不在 make 为 运行 时进行评估。

QtCreator 的构建依赖于 make 检测更改的能力,并且会在检测到对 CMakeLists.txt 文件的更改时调用 CMake。

最可靠且推荐的方法是手动明确命名和列出所有源文件和头文件。

一键"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",或者在编辑器中用空白 space 加上修改 CMakeList.txt a CTRL+S(如果有人在 "Options > Build & Run > CMake" 激活了 'Autorun CMake')。这两个操作都会使用新文件更新列出的文件树,准备好构建和 运行 (CTRL+R)。

从我的拙见来看,我认为当一个人在新项目中不断创建和重命名文件时,这是一种更舒适的方式(在我的例子中,我还添加了 *.h*.hpp,为了能够看到项目中列出的那些文件)。