究竟QtCreator Build / Clean到底是什么?

时间:2016-12-16 13:17:17

标签: c++ cmake qt-creator

我在Qake中使用QtCreator。在我的CMakeLists.txt文件中,我使用<runtime> <assemblyBinding configSource="runtime.config" /> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> ,以避免在添加新源时编辑文件。那个时候当然CMake并没有改变它应该编译的可用文件。我希望如果我使用Build / Clean,它将清理缓存,当我重新编译项目时,我的新源文件将被找到。但是,QtCreator忽略了新添加的文件。我需要手动清理构建目录,然后运行GLOB_RECURSE QOBJECT_SOURCES "*.cpp"。那么,Build / Clean究竟是什么产生的,与Build / Rebuild相比有什么区别? QtCreator中有什么东西,我可以让编译器知道我的新文件吗?

2 个答案:

答案 0 :(得分:0)

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

QtCreator的Build取决于make检测更改的能力,并在检测到CMakeLists.txt文件的更改时调用CMake。

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

答案 1 :(得分:0)

当一次推动&#34;构建&gt;清除CMake配置&#34;,删除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中只需按下&#34; Build&gt;运行CMake&#34;,或者在编辑器中使用空格加CTRL + S修改CMakeList.txt(如果已经激活了&#39;自动运行CMake&#39; at&#34;选项&gt; Build&amp; Run&gt; CMake的&#34)。这两个操作都使用新文件更新列出的文件树,准备进行构建和运行(CTRL + R)。

从我不起眼的角度来看,我认为在新项目中不断创建和重命名文件时,这是一种更舒适的方式(在我的情况下,我添加*.h*.hpp另外,为了能够看到项目中列出的那些文件。