Я использую QtCreator с CMake. В моих файлах CMakeLists.txt я использую GLOB_RECURSE QOBJECT_SOURCES "*.cpp"
, чтобы избежать редактирования файла при добавлении нового источника. Разумеется, CMake не изменит свое мнение о доступных файлах, которые он должен скомпилировать. Я ожидал, что если я буду использовать Build/Clean, он очистит кеши, и когда я перекомпилирую проект, будут найдены новые исходные файлы. Однако QtCreator игнорирует недавно добавленный файл. Мне нужно очистить каталог сборки вручную и запустить cmake ..; make
. Итак, что именно делает Build/Clean и какая разница в сравнении с Build/Rebuild? Есть ли что-нибудь в QtCreator, я могу сделать свой новый файл известным компилятору?Что именно делает QtCreator Build/Clean?
ответ
Когда один толчок "Build> Очистить 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 (если один активировал «Autorun CMake» в «Параметры> Сборка & Запуск> CMake»). Оба действия обновляют дерево перечисленных файлов новыми файлами, готовыми для сборки и запуска (CTRL + R).
С моей скромной точки зрения, я думаю, что это более удобный способ, когда вы постоянно создаете и переименовываете файлы в новом проекте (в моем случае я добавляю *.h
и *.hpp
также, чтобы иметь возможность видеть файлы, перечисленные в проект).
В этом проблема с CMake file(GLOB ...)
: Он оценивается только при запуске CMake, а не при выполнении make.
QtCreator's Build зависит от способности make обнаруживать изменения и вызывать CMake при обнаружении изменений в файлах CMakeLists.txt.
Самый надежный и рекомендуемый способ - явно указать и перечислить все исходные и заголовочные файлы вручную.
Вы правы, и эта информация уже присутствовала в моем вопросе. Я ожидал, что QtCreator Build/Clear позволит «обнаруживать изменения», но это не так. Для чего это полезно? – katang