我正在用CMake使用QtCreator。在我的CMakeLists.txt文件中,我使用GLOB_RECURSE QOBJECT_SOURCES "*.cpp"
,只是爲了避免在添加新源時編輯文件。當然,CMake並沒有改變它應該編譯的可用文件的想法。我期望如果使用Build/Clean,它會清除緩存,當我重新編譯項目時,我的新源文件將被找到。但是,QtCreator會忽略新添加的文件。我需要手動清理構建目錄,並運行cmake ..; make
。那麼,Build/Clean究竟做了什麼,與Build/Rebuild有什麼不同呢? QtCreator中有什麼,我可以讓我的新文件知道編譯器?QtCreator Build/Clean究竟做了什麼?
回答
當一個人推「建設>清除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
另外,可以看到在列出的文件更舒適的做法項目)。
這是CMake的file(GLOB ...)
的問題:只有在CMake運行時纔會評估,而不是在運行make時評估。
QtCreator的Build取決於make檢測更改的能力,並在檢測到CMakeLists.txt文件發生更改時調用CMake。
最強大的推薦方法是手動顯式命名和列出所有源文件和頭文件。
- 1. visibleContentsAsDataURL究竟做了什麼?
- 2. KeyListener究竟做了什麼?
- 3. document.normalize究竟做了什麼?
- 4. MapView.preLoad()究竟做了什麼?
- 5. handleParkingUpdate()究竟做了什麼?
- 6. MIBCC.EXE究竟做了什麼?
- 7. UserTransactionManager究竟做了什麼
- 8. rbind.fill.matrix究竟做了什麼?
- 9. rangeOfCharacterFromSet究竟做了什麼?
- 10. Panel.IsItemsHost究竟做了什麼?
- 11. 「setContentView」究竟做了什麼?
- 12. fillMode究竟做了什麼?
- 13. .selectAll()究竟做了什麼?
- 14. JspFragment.invoke究竟做了什麼?
- 15. '互斥鎖'究竟做了什麼?
- 16. Android SDK Manager究竟做了什麼?
- 17. 餅乾。我究竟做錯了什麼?
- 18. Int32.Parse究竟做了什麼?
- 19. Python的struct.pack究竟做了什麼?
- 20. Class :: MethodMaker究竟做了什麼?
- 21. pcap中的ntohs()究竟做了什麼?
- 22. requestValidationMode =「2.0」究竟做了什麼?
- 23. 硒中的ime()究竟做了什麼?
- 24. 這段JavaScript究竟做了什麼?
- 25. Resolve-Path cmdlet究竟做了什麼?
- 26. 全選?我究竟做錯了什麼?
- 27. EntityClient Provider - 它究竟做了什麼?
- 28. 。我究竟做錯了什麼?
- 29. gc_heap :: plan_phase究竟做了什麼?
- 30. Compass/Blurprint的+ clearfix究竟做了什麼?
你是對的,這個信息已經存在於我的問題中。我預計QtCreator Build/Clear將會「檢測到變化」,但事實並非如此。它有什麼好處? – katang