2016-12-16 9 views
1

Я использую QtCreator с CMake. В моих файлах CMakeLists.txt я использую GLOB_RECURSE QOBJECT_SOURCES "*.cpp", чтобы избежать редактирования файла при добавлении нового источника. Разумеется, CMake не изменит свое мнение о доступных файлах, которые он должен скомпилировать. Я ожидал, что если я буду использовать Build/Clean, он очистит кеши, и когда я перекомпилирую проект, будут найдены новые исходные файлы. Однако QtCreator игнорирует недавно добавленный файл. Мне нужно очистить каталог сборки вручную и запустить cmake ..; make. Итак, что именно делает Build/Clean и какая разница в сравнении с Build/Rebuild? Есть ли что-нибудь в QtCreator, я могу сделать свой новый файл известным компилятору?Что именно делает QtCreator Build/Clean?

ответ

0

Когда один толчок "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 также, чтобы иметь возможность видеть файлы, перечисленные в проект).

0

В этом проблема с CMake file(GLOB ...): Он оценивается только при запуске CMake, а не при выполнении make.

QtCreator's Build зависит от способности make обнаруживать изменения и вызывать CMake при обнаружении изменений в файлах CMakeLists.txt.

Самый надежный и рекомендуемый способ - явно указать и перечислить все исходные и заголовочные файлы вручную.

+0

Вы правы, и эта информация уже присутствовала в моем вопросе. Я ожидал, что QtCreator Build/Clear позволит «обнаруживать изменения», но это не так. Для чего это полезно? – katang