我正在使用带有 CMake 的 QtCreator。在我的 CMakeLists.txt 文件中,我使用 GLOB_RECURSE QOBJECT_SOURCES "*.cpp"
,只是为了避免在添加新源时编辑文件。那个时候 CMake 当然不会改变它应该编译的可用文件的想法。我希望如果我使用 Build/Clean,它会清理缓存,并且当我重新编译项目时,会找到我的新源文件。然而,QtCreator 忽略了新添加的文件。我需要手动清理构建目录,然后运行 cmake ..;制作
。那么,Build/Clean 到底做了什么,与 Build/Rebuild 有什么区别? QtCreator 中有什么东西可以让编译器知道我的新文件吗?
最佳答案
当按下“Build > Clear CMake Configuration”时,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 中只需要按下“Build > Run CMake”,或者在编辑器中修改 CMakeList.txt 使用空格加 CTRL+S(如果一个已在“选项 > 构建和运行 > CMake”中激活“自动运行 CMake”)。这两个操作都会使用新文件更新列出的文件树,为构建和运行 (CTRL+R) 做好准备。
从我的拙见来看,我认为当一个人在新项目中不断创建和重命名文件时,这是一种更舒适的方式(在我的例子中,我添加了 *.h
和 * .hpp
也可以看到项目中列出的那些文件)。
关于c++ - QtCreator Build/Clean 究竟是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41185293/