2016-12-16 341 views
1

我正在用CMake使用QtCreator。在我的CMakeLists.txt文件中,我使用GLOB_RECURSE QOBJECT_SOURCES "*.cpp",只是为了避免在添加新源时编辑文件。当然,CMake并没有改变它应该编译的可用文件的想法。我期望如果使用Build/Clean,它会清除缓存,当我重新编译项目时,我的新源文件将被找到。但是,QtCreator会忽略新添加的文件。我需要手动清理构建目录,并运行cmake ..; make。那么,Build/Clean究竟做了什么,与Build/Rebuild有什么不同呢? QtCreator中有什么,我可以让我的新文件知道编译器?QtCreator Build/Clean究竟做了什么?

回答

0

当一个人推“建设>清除CMake的配置”,该文件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(if一个已经在“Options> Build & Run> CMake”中激活了'Autorun CMake')。这两个操作都会使用新文件更新列出的文件树,为构建和运行(CTRL + R)做好准备。

从我的角度谦虚点,我认为这是当一个人不断创造和新项目重命名文件(在我来说,我想补充*.h*.hpp另外,可以看到在列出的文件更舒适的做法项目)。

0

这是CMake的file(GLOB ...)的问题:只有在CMake运行时才会评估,而不是在运行make时评估。

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

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

+0

你是对的,这个信息已经存在于我的问题中。我预计QtCreator Build/Clear将会“检测到变化”,但事实并非如此。它有什么好处? – katang