Opened 8 years ago

Closed 8 years ago

Last modified 7 years ago

#186 closed улучшение (fixed)

Убрать из проекта moc_*.cpp

Reported by: alx Owned by: dimag
Priority: minor Milestone: 2 очередь
Component: ПО MC04-Dispatcher. Пульт диспетчера/техника Keywords: moc
Cc: san

Description

Файлы moc_*.cpp не являются исходными файлами, они генерируются программой moc в процессе сборки. Поэтому включать их в проект не следует.

Change History (6)

comment:1 by dimag, 8 years ago

Resolution: invalid
Status: newclosed

Для компиляции Qt в Linux можно не включать.
Для компиляции Qt в Windows включать данные файлы необходимо, так как в moc-файлах генерируется код посылки сообщений для, тела функций для получения информации об объекте. Без них просто сборка завершиться с ошибкой, а компилятор Visual Studio автоматически не компилирует moc-файлы

comment:2 by alx, 8 years ago

  1. Правильно ли я понял, что, создавая эту программу под Windows, Вы написали текст файлов moc_*.cpp вручную (то есть в текстовом редакторе)?
  2. Что значит "компилятор не компилирует moc-файлы"? Если не компилирует, то для чего тогда они вообще нужны в проекте? Или Вы имели в виду "автоматически не создает"? Так их компилятор С++ и не должен создавать, для генерации файлов moc_*.cpp в комплекте Qt есть специальная программа - moc (Meta-Object Compiler). А для компилятора C++ эти файлы уже являются входными данными.
  3. Файлы moc_*.cpp не являются переносимыми, то есть они несовместимы между разными версиями Qt (дам даже проверка версии выполняется препроцессором). Это еще одна (и, пожалуй, главная) причина, почему эти файлы должны генерироваться программой moc именно от той версии Qt, с которой собирается программа.
  4. Наконец, почему "для компиляции Qt в Linux можно не включать", а в Windows - нельзя? В чем разница?

comment:3 by alx, 8 years ago

Keywords: moc added
Resolution: invalid
Status: closedreopened

Отсутствие ответа я расцениваю как отсутствие аргументированных возражений.

Естественно, что файлы moc_*.cpp Дмитрий писал не руками в текстовом редакторе, это подтверждает и коментарий в начале каждого файла, в котором сказано:

** Created by: The Qt Meta Object Compiler version 67 (Qt 5.6.0)

То есть файлы moc_*.cpp были созданы программой moc из файлов *.h. Следовательно, файлы moc_*.cpp не являются исходными файлами, а являются промежуточными данными. И, следовательно, в репозитории они храниться не должны, а должны генерироваться в процессе сборки.

Ну и, естественно, что в Windows это файлы можно (и нужно) не включать точно также, как и в любой другой ОС.

comment:4 by dimag, 8 years ago

Я убрал файл moc_MainAppFrameWindow3.cpp из проекта в Visual Studio.
Попробовал перекомпилировать, в итоге получил кочу ошибок от компоновщика вида
1>MainAppFrameWindow3.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * thiscall MainAppFrameWindow3::metaObject(void)const " (?metaObject@MainAppFrameWindow3@@UBEPBUQMetaObject@@XZ)
1>MainAppFrameWindow3.obj : error LNK2001: unresolved external symbol "public: virtual void *
thiscall MainAppFrameWindow3::qt_metacast(char const *)" (?qt_metacast@MainAppFrameWindow3@@UAEPAXPBD@Z)
1>MainAppFrameWindow3.obj : error LNK2001: unresolved external symbol "public: virtual int thiscall MainAppFrameWindow3::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MainAppFrameWindow3@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>MainAppFrameWindow3.obj : error LNK2019: unresolved external symbol "public: void
thiscall MainAppFrameWindow3::AddToConference(void *,void *,class QString const &,int,int)" (?AddToConference@MainAppFrameWindow3@@QAEXPAX0ABVQString@@HH@Z) referenced in function "protected: bool thiscall MainAppFrameWindow3::PrepareForAddToConference(void *,void *,class QString const &)" (?PrepareForAddToConference@MainAppFrameWindow3@@IAE_NPAX0ABVQString@@@Z)
1>MainAppFrameWindow3.obj : error LNK2019: unresolved external symbol "public: void
thiscall MainAppFrameWindow3::NewConference(void *,void *,int,int)" (?NewConference@MainAppFrameWindow3@@QAEXPAX0HH@Z) referenced in function "protected: bool thiscall MainAppFrameWindow3::PrepareForNewConference(void *,void *)" (?PrepareForNewConference@MainAppFrameWindow3@@IAE_NPAX0@Z)
1>MainAppFrameWindow3.obj : error LNK2019: unresolved external symbol "public: void
thiscall MainAppFrameWindow3::PlayRecord(class QString const &)" (?PlayRecord@MainAppFrameWindow3@@QAEXABVQString@@@Z) referenced in function "private: void thiscall MainAppFrameWindow3::PauseButtonPressed(void)" (?PauseButtonPressed@MainAppFrameWindow3@@AAEXXZ)
1>MainAppFrameWindow3.obj : error LNK2019: unresolved external symbol "public: void
thiscall MainAppFrameWindow3::PauseResumeRecord(void)" (?PauseResumeRecord@MainAppFrameWindow3@@QAEXXZ) referenced in function "private: void thiscall MainAppFrameWindow3::PauseButtonPressed(void)" (?PauseButtonPressed@MainAppFrameWindow3@@AAEXXZ)

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

comment:5 by dimag, 8 years ago

Resolution: fixed
Status: reopenedclosed

r245
Убрал файлы
moc_MainAppFrameWindow.cpp
moc_MainAppFrameWindow2.cpp
moc_MainAppFrameWindow3.cpp
r246
moc_StartupDlg.cpp
moc_TelephoneNumberDlg.cpp
moc_WarningDialog.cpp

comment:6 by san, 7 years ago

Milestone: Текущее2 очередь

Milestone renamed

Note: See TracTickets for help on using tickets.