Какова цель мусора (файлов), который автоматически генерирует Qt Creator, и как я могу их приручить? - PullRequest
6 голосов
/ 25 мая 2010

Я довольно новичок в Qt, и я использую новую бета-версию Nokia Qt SDK, и в свободное время я работаю над созданием небольшого приложения для моего Nokia N900.
К счастью, мне удалось все правильно настроить, а также запустить приложение на устройстве.

Я изучил C ++ в школе, поэтому подумал, что это будет не так сложно.
Я использую Qt Creator в качестве своей IDE, потому что он не работает с Visual Studio.

Я также хочу перенести свое приложение на Symbian, поэтому я несколько раз запускал эмулятор и компилировал для Windows отладку самых злых ошибок. (Отладчик не работает правильно на устройстве.)

Я пришел из .NET, поэтому есть некоторые вещи, которые я не понимаю.

Когда я нажимаю кнопку сборки, Qt Creator генерирует кучу файлов в каталог моего проекта:

  • moc_*.cpp файлов - я не знаю их назначение. Может кто-нибудь сказать мне?
  • *.o файлы - я предполагаю, что это объектный код
  • *.rss файлов - я не знаю их назначения, но они определенно не имеют никакого отношения к RSS
  • Makefile и Makefile.Debug - понятия не имею
  • AppName (без расширения) - исполняемый файл для Maemo и AppName.sis - исполняемый файл для Symbian, я полагаю?
  • AppName.loc - Понятия не имею
  • AppName_installer.pkg и AppName_template.pkg - понятия не имею
  • qrc_Resources.cpp - Я думаю, это для моих ресурсов Qt

(где AppName - название рассматриваемой заявки)

Я заметил, что эти файлы можно безопасно удалить, Qt Creator просто восстанавливает их.
Проблема в том, что они загрязняют мой исходный каталог. Тем более, что я использую контроль версий, и если они могут быть восстановлены, нет смысла загружать их в SVN.

Итак, кто-то может сказать мне, какова точная цель этих файлов, и как я могу попросить Qt Creator поместить их в другой каталог?

EDIT:

Кажется, я узнал больше из ответов на этот вопрос, чем думал, что узнаю. :)
Большое спасибо всем, кто помог мне. Я дал всем голос, потому что я мог узнать что-то новое из каждого ответа.

На самом деле то, что Роб рекомендовал, кажется наиболее удобным решением, но я отметил, что ответ Котти принят, потому что он предоставил мне лучшее объяснение того, как работает механизм сборки Qt.

Решение:

Кажется, что ни инструментарий Maemo, ни Symbian пока не поддерживают теневые сборки, поэтому я использую их в своем файле проекта для решения ситуации:

DESTDIR = ./NoSVN
OBJECTS_DIR = ./NoSVN
MOC_DIR = ./NoSVN
RCC_DIR = ./NoSVN
UI_HEADERS_DIR = ./NoSVN

Ответы [ 4 ]

18 голосов
/ 25 мая 2010

Не полностью ответ на ваш вопрос, но только часть его :) Кроме того, это googlable.

Думаю, что если вы разрабатываете на C ++, вы должны знать, что означает Makefile. Также я думаю, что файл .loc - это, как правило, файл с локализованными строками / содержимым.

альтернативный текст http://thelins.se/learnqt/wp-content/uploads/qt-buildsystem.png

Сравнивая систему сборки C ++ с системой сборки Qt, вы можете видеть, что система сборки C ++ (серые прямоугольники) осталась неизменной. Мы все еще строим код C ++ здесь. Тем не менее, мы добавляем больше источников и заголовков. Здесь задействованы три генератора кода:

Компилятор мета-объекта (moc на иллюстрации) - компилятор мета-объекта берет все классы, начиная с макроса Q_OBJECT, и генерирует исходный файл moc _ *. Cpp C ++. Этот файл содержит информацию о перемещаемом классе, такую ​​как имя класса, дерево наследования и т. Д., А также реализацию сигналов. Это означает, что когда вы излучаете сигнал, вы фактически вызываете функцию, сгенерированную moc.

Компилятор пользовательского интерфейса (uic на иллюстрации) - Компилятор пользовательского интерфейса берет дизайны из Designer и создает файлы заголовков. Эти заголовочные файлы затем, как обычно, включаются в исходные файлы, что позволяет вызвать setupUi для создания дизайна пользовательского интерфейса.

Компилятор ресурсов Qt (на иллюстрации rcc) - Компилятор ресурсов - это то, о чем мы еще не говорили. Это позволяет встраивать изображения, текстовые файлы и т. Д. В ваш исполняемый файл, но при этом обращаться к ним как к файлам. Мы рассмотрим это позже, я просто хочу включить его в эту картинку, где он принадлежит.

Я надеюсь, что эта иллюстрация проясняет, что на самом деле делает Qt, чтобы добавлять новые красивые ключевые слова в C ++. Если вам интересно - не стесняйтесь читать некоторые из сгенерированных файлов. Просто не изменяйте их - они обновляются каждый раз, когда вы создаете свое приложение.

Если вы используете QtCreator, файлы moc генерируются в подкаталогах debug и release каталога вашего проекта. Файлы uic хранятся в корне каталога проекта. Файлы rcc обычно скучны, но я уверен, что вы можете найти их где-нибудь в иерархии каталогов вашего проекта.


Редактировать: Вам не нужно включать эти файлы в ваш SVN. Это почти то же дерьмо, что и фиксация .ncb, .pdb и других временных файлов. Каждый раз, когда вы что-то изменяете в своем приложении Qt, эти временные файлы восстанавливаются как обновление ваших изменений, поэтому нет смысла фиксировать их в SVN.

5 голосов
/ 25 мая 2010

Вы можете указать qmake (и, следовательно, QtCreator) поместить сгенерированные файлы в другое место, добавив следующее в ваш файл .pro для проекта

UI_DIR = .ui
MOC_DIR = .moc
OBJECTS_DIR = .obj

Это поместит все файлы пользовательского интерфейса в каталог .ui, файлы moc в каталог .moc и все файлы .o в каталог .obj. (Конечно, вы можете изменить их, как вам нравится)

Соответствующая справка для qmake: http://doc.qt.io/archives/4.6/qmake-variable-reference.html#moc-dir

2 голосов
/ 25 мая 2010

Если вы используете теневые сборки (включены по умолчанию в Qt Creator 2.0 beta ), все эти временные файлы создаются в отдельной папке. Например:

\MyProjects\ProjectFoo
\MyProjects\ProjectFoo-build

Очень полезно ИМХО.

1 голос
/ 25 мая 2010

Не пытайтесь получить файлы, хранящиеся в другом каталоге; вместо этого расскажите Subversion, чтобы они игнорировались, как описано, например, в http://svnbook.red -bean.com / ru / 1.4 / svn.advanced.props.special.ignore.html .

Большинство систем контроля версий имеют хорошую поддержку игнорирования сгенерированных файлов, поскольку это проблема, с которой сталкивается практически каждый программный проект.

...