2016-12-16 340 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