我正在用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