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 究竟做了啥?的主要内容,如果未能解决你的问题,请参考以下文章

Qt - 经过这么多尝试后,静态链接失败了

Android studio清理项目构建

Qt - 经过多次尝试后静态链接失败

MissingSchemaAction.AddWithKey 究竟做了啥?

`-rdynamic` 究竟做了啥,啥时候需要它?

setUseWideViewPort() 和 setLoadWithOverviewMode() 究竟做了啥?