#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 , 8 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
comment:2 by , 8 years ago
- Правильно ли я понял, что, создавая эту программу под Windows, Вы написали текст файлов moc_*.cpp вручную (то есть в текстовом редакторе)?
- Что значит "компилятор не компилирует moc-файлы"? Если не компилирует, то для чего тогда они вообще нужны в проекте? Или Вы имели в виду "автоматически не создает"? Так их компилятор С++ и не должен создавать, для генерации файлов moc_*.cpp в комплекте Qt есть специальная программа - moc (Meta-Object Compiler). А для компилятора C++ эти файлы уже являются входными данными.
- Файлы moc_*.cpp не являются переносимыми, то есть они несовместимы между разными версиями Qt (дам даже проверка версии выполняется препроцессором). Это еще одна (и, пожалуй, главная) причина, почему эти файлы должны генерироваться программой moc именно от той версии Qt, с которой собирается программа.
- Наконец, почему "для компиляции Qt в Linux можно не включать", а в Windows - нельзя? В чем разница?
comment:3 by , 8 years ago
Keywords: | moc added |
---|---|
Resolution: | invalid |
Status: | closed → reopened |
Отсутствие ответа я расцениваю как отсутствие аргументированных возражений.
Естественно, что файлы 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 , 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 , 8 years ago
Resolution: | → fixed |
---|---|
Status: | reopened → closed |
Для компиляции Qt в Linux можно не включать.
Для компиляции Qt в Windows включать данные файлы необходимо, так как в moc-файлах генерируется код посылки сообщений для, тела функций для получения информации об объекте. Без них просто сборка завершиться с ошибкой, а компилятор Visual Studio автоматически не компилирует moc-файлы