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

Я довольно новичок в 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 поместить их в другой каталог?

РЕДАКТИРОВАТЬ:

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

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

Решение:

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

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

4 ответа

Решение

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

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

http://thelins.se/learnqt/wp-content/uploads/qt-buildsystem.png

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

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

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

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

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

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


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

Вы можете указать 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

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

\MyProjects\ProjectFoo
\MyProjects\ProjectFoo-build

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

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

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

Другие вопросы по тегам