Qt4 в Visual Studio 2008 – файлы moc-ed исключаются из сборки?
-
05-07-2019 - |
Вопрос
Недавно я установил VS Addin из Qt Software и импортировал свой проект .pro в VS2008.В целом все работает нормально, за одним небольшим, но досадным исключением.
Предположим, у меня есть файл file.cpp с классом, который объявляет, что это Q_OBJECT.Таким образом, файл создан в формате MOC, и создается moc_file.cpp, который доступен в решении в разделе «Сгенерированные файлы».Все идет нормально.
Самое смешное, что когда я что-то меняю в file.cpp (например, добавляю строку) и сохраняю файл с помощью Ctrl+S, moc_file.cpp исключается из сборки (на значке можно увидеть знак отсутствия записи). ).И я сталкиваюсь со множеством типичных ошибок компоновщика, когда нажимаю F7 для создания решения.Чтобы исправить ситуацию, мне нужно зайти в свойства moc_file.cpp и изменить «Исключить из сборки» с «Да» на «Нет».Тогда все работает нормально.
Кто-то еще испытывает то же самое?Я делаю что-то неправильно?
Решение
Проблема решена. Я обнаружил, что в моем собственном .pro-файле, описывающем мой проект, я указал MOC_DIR как:
MOC_DIR = .moc
После импорта в каталог Visual Studio для " Сгенерированных файлов " был одинаковым как для Release, так и для Debug. Итак, когда моей активной конфигурацией была, например, Debug, когда я сохранил файл, он был исключен из сборки, потому что это было целесообразно для файла, связанного с релизом, - как предложили rpg и Andrew. После изменения каталога на .moc \ $ (ConfigurationName) проблема больше не видна (и я вижу 2 версии каждого сгенерированного файла в моем решении - по одной для каждой конфигурации).
Спасибо всем за помощь!
Другие советы
На самом деле, я нашел решение для этой "функции". Вы должны добавить ОБА файлы из GeneratedFiles \ Debug и GeneratedFiles \ Debug (или из других каталогов конфигураций). Qt исключит из сборки все, что не относится к выбранному типу сборки.
Да, я использую последний VS Addin, и мой проект правильно рассматривается как Qt Project.
вы правильно установили конфигурацию?
Откройте окно «Настройки конфигурации отладки». Установите следующие элементы, как указано ниже:
- «Командная строка сборки» qmake -project & qmake & nmake debug
- «Чистые команды» nmake debug-clean
- «Перестроить командную строку» qmake и отладка nmake
Повторите то же самое с конфигурацией выпуска.
Я видел поведение исключения из сборки в VS2008 (также и в VS 2003), но проект собирается правильно.Когда вы меняете moc-файл, Qt придется воссоздать moc-файл, поскольку он устарел.
Я подозреваю, что алгоритм Qt выглядит примерно так:
- обнаружить, что файл был изменен
- установить старый файл moc как исключенный из сборки
- добавить в проект новый файл с тем же именем и включить его в сборку
Глядя на мой проект VS 2003, я вижу, что некоторые файлы moc_* включены в проект дважды: одна версия помечена как исключенная из сборки, а другая — нет.
Повторное создание файла .vsproj
с помощью qmake может решить проблему. Р>
Для каждого имеющегося у вас файла QObject плагин QT создает файл moc_ для каждой конфигурации сборки (обычно это только Debug и Release). Когда вы меняете текущую конфигурацию, вы можете видеть, как знаки «Нет записи» переходят из одного файла в другой.
Файлы moc_ не должны изменяться при изменении файла .cpp. только когда вы меняете файлы .h. Все это приводит меня к мысли, что с вашей конфигурацией произошло что-то не так, и действительно лучший способ исправить это - воссоздать ее с помощью qmake, используя что-то вроде этого:
qmake -spec win32-msvc2008