Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Natalie от Январь 11, 2006, 12:42



Название: Проблемы с moc !!!
Отправлено: Natalie от Январь 11, 2006, 12:42
Расфасовала файлы в проекте по папкам.
Некоторые классы в этих новых папках используют Q_OBJECT macro. Для этих классов moc должен генерить файлы .cpp, но он (moc) этого не делает, видно не просматривает мои новые папки.  :(
Что мне нужно сделать, чтоб решить эту проблему?

Помогите, пожалуйста!!!


Название: Проблемы с moc !!!
Отправлено: Steven_Orko от Январь 11, 2006, 13:04
Попробуй сначала очистить проект Build->Batch Build. Там выбираешь все, что есть и нажимаешь Clean. А потом все заново посторой. А зачем ты сама распихивала файлы по папкам? Это должно автоматом быть... В свойствах студии в закладке Qt все прописано, кажется....


Название: Проблемы с moc !!!
Отправлено: ElderOrb от Январь 11, 2006, 13:04
Когда у меня была похожая ситуация всё что я сделал это поудалял из всех файлом Q_OBJECT, попробовал скомпилить - получил ожидаемую ругань, и снова подобавлял Q_OBJECT. В моём случае помогло.


Название: Проблемы с moc !!!
Отправлено: Natalie от Январь 11, 2006, 13:32
В папке с моим проектом сейчас лежат все стандартные папки (такие как Debug, Generated Files...). Я создала еще одну папку (Options), в которую положила некоторое количество файлов .cpp, .h. Включила эту папку в проект (в Additional Include Directories).

Для файлов, которые находятся в корне моего проекта в процессе компиляции появляется такая строка:
Moc'ing qtattempt.h...

После этого начинается компиляция всех .cpp.
Т.е. файлы, находящиеся не в корне (в моей папке Options), moc просто не просматривает.
Что же мне надо сделать, чтоб moc их начал просматривать????  :cry:


Советы по поводу удаления из всех файлов Q_OBJECT, а также очистке проекта, к сожалению :( , не увенчались успехом.  :cry:

P.S. Мне обязательно нужно, чтоб была эта папка Options, т.к. проект большой и надо, чтоб он выглядел аккуратно.


Название: Проблемы с moc !!!
Отправлено: Steven_Orko от Январь 11, 2006, 13:34
А сами файлы ты в проект включала? У меня точно также по отдельным папочкам лежал исходники в одном проекте. Я каждый файл включил в проект и все отработало


Название: Проблемы с moc !!!
Отправлено: Natalie от Январь 11, 2006, 13:39
Да, конечно включила.
Сделала: Add->New Folder. А далее в нее кинула все файлы из моей папки.


Название: Проблемы с moc !!!
Отправлено: Steven_Orko от Январь 11, 2006, 13:45
Не понял. Ты в Solutions Explorere создала новую папку и добавила туда свои файлы???


Название: Проблемы с moc !!!
Отправлено: Natalie от Январь 11, 2006, 13:48
Ага!

А что, надо было как-то по-другому? Мне в самом проекте тоже нужно, чтоб все по папкам было разложено.


Название: Проблемы с moc !!!
Отправлено: Racheengel от Январь 11, 2006, 13:48
а какая версия Qt и какая IDE?


Название: Проблемы с moc !!!
Отправлено: Steven_Orko от Январь 11, 2006, 13:51
У меня и таким образом обрабатывается...
можешь проект переслать на почту? только без объектных файлов...


Название: Проблемы с moc !!!
Отправлено: Natalie от Январь 11, 2006, 13:51
Qt4.


Название: Проблемы с moc !!!
Отправлено: Steven_Orko от Январь 11, 2006, 13:54
Попробуй удалить все: релиз, дебаг и генератед файс - и перекомпилируй

to Racheengel
Можешь в асю ченть скинуть? я чего-то не добавил тебя в контактлист


Название: Проблемы с moc !!!
Отправлено: Steven_Orko от Январь 11, 2006, 16:40
Архив получил. сходу задал Rebuild.... и что вы думаете? Проект спокойно откомпилился без ошибок и даже с c Q_OBJECT. Хотя потом стал ругаться на ресурсы. но дело поправило удаление все трех каталогов, которые я писал. Вообще, Natalie, зачем ты так усложнила? если используешь qrc, то зачем пользуешься еще и rc? ИМХО, логичнее было бы что-то одно...


Название: Проблемы с moc !!!
Отправлено: Natalie от Январь 11, 2006, 17:27
Не знаю как у тебя так вот вышло.
У меня с Q_OBJECT для всех классов из файлов HeaderDialogWidget и OptionsDialog появляются ошибки типа:

QtAttempt error LNK2001: unresolved external symbol "public: virtual int __thiscall HeaderDialogWidget::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@HeaderDialogWidget@@UAEHW4Call@QMetaObject@@HPAPAX@Z)

QtAttempt error LNK2001: unresolved external symbol "public: virtual void * __thiscall OptionsDialog::qt_metacast(char const *)" (?qt_metacast@OptionsDialog@@UAEPAXPBD@Z)

У тебя при Rebuild помимо
  Moc'ing qtattempt.h...
  Moc'ing combodelegate.h...
пишется
  Moc'ing optionsdialog.h...
  Moc'ing headerdialogwidget.h...  ??

и в Generated Files появляются файлы
  moc.optionsdialog.cpp
  moc.headerdialogwidget.cpp  ??

у меня ничего такого не происходит  :(

добавлено спустя 58 секунд:

 Не знаю как у тебя так вот вышло.
У меня с Q_OBJECT для всех классов из файлов HeaderDialogWidget и OptionsDialog появляются ошибки типа:

QtAttempt error LNK2001: unresolved external symbol "public: virtual int __thiscall HeaderDialogWidget::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@HeaderDialogWidget@@UAEHW4Call@QMetaObject@@HPAPAX@Z)

QtAttempt error LNK2001: unresolved external symbol "public: virtual void * __thiscall OptionsDialog::qt_metacast(char const *)" (?qt_metacast@OptionsDialog@@UAEPAXPBD@Z)

И при Rebuild помимо
  Moc'ing qtattempt.h...
  Moc'ing combodelegate.h...
пишется
  Moc'ing optionsdialog.h...
  Moc'ing headerdialogwidget.h...  ??

и в Generated Files появляются файлы
  moc.optionsdialog.cpp
  moc.headerdialogwidget.cpp  ??

у меня ничего такого не происходит  :(


Название: Проблемы с moc !!!
Отправлено: Steven_Orko от Январь 11, 2006, 18:11
В самом начале, когда ничего нет, они появляются. А потом уже до тех пор, пока я не поменяю что-то, связанное с мета-информацией в объекте. Есть предложение. Давай я поменяю твой проект, как мне кажется логичнее, а ты посмотришь, если что, подправишь под себя?


Название: Проблемы с moc !!!
Отправлено: Racheengel от Январь 11, 2006, 18:21
Вообще у меня подобная проблема была. Решилось все установкой VS Integrator 1.2.0 и пересохранением всех файлов из оболочки.


Название: Проблемы с moc !!!
Отправлено: Steven_Orko от Январь 11, 2006, 19:25
to Natalie:
Я тебе письмо послал с немного подправленным проектом. Посмотри почту...


Название: Проблемы с moc !!!
Отправлено: Mikhail от Январь 11, 2006, 20:14
to Natalie:
Решение вопроса кажется простое.
Необходимо создать проектный файл - pro. Например, project.pro
Выполнить "qmake project.pro", а далее nmake. Все должно получиться.
Очевидно не созданы каталоги в которые moc помещает результаты своей работы.


Название: Проблемы с moc !!!
Отправлено: Natalie от Январь 12, 2006, 12:23
to Steven_Orko:
Большое спасибо.

Но я не совсем поняла в чем заключалась проблема с мета информацией.
Что из того, что ты поменял относится к решению именно этой проблемы? (а не к изменению внешнего вида проекта)


Название: Проблемы с moc !!!
Отправлено: Steven_Orko от Январь 12, 2006, 15:01
Насколько я понял, у тебя проблемма исчезла? Это хорошо.
Цитировать
Но я не совсем поняла в чем заключалась проблема с мета информацией.
Что из того, что ты поменял относится к решению именно этой проблемы? (а не к изменению внешнего вида проекта)

Ну, например, как уже писал Mikhail, иногда возникает проблемма, когда нет файла проекта *.pro. К тому же я где-то в другом англоязычном формуче читал, что есть проблемма, когда используются два типа ресурсов.
Что я сделал:
 - удалил ресурсы windows, оставил только ресурсы Qt (qrc).
 - создал проект Qt, удалив проект SV.
 - пересоздал проект VS на основе проекта Qt.
 - немного все систематизировал...

Кстати, когды ты будешь добавлять новые ресурсы, то тебе надо стереть файл qrc_<имя файла>.cpp, если будут проблеммы с их добавляемостью в проект.


Название: Проблемы с moc !!!
Отправлено: Dendy от Январь 12, 2006, 17:50
Прекомпиллятор действительно иногда сбоит. Но не из-за собственньІх ошибок. Я так понимаю файл с метаинформацией бьІл добавлен в проект и компилировался. Для начала нужно бьІло глянуть его содержимое - он мог бьІть просто пустьІм. Если нет - смотреть пересоздаётся ли он (поправить заголовочник). Непересоздаваться он может, если прекомпиллятор думает, что мета-информация новей, чем сам заголовочник, такое бьІвает после игр с системньІм временем, когда проект бьІл сохранён позднее текущего времени.

Ещё не такая частая, но не менее действенная проблема - банально нет места на диске - файл создаётся, время создания вьІставляется, компиллируется, но размер ему - ноль.

БьІвает и такое, что moc_ файл должен создаваться во временной папке, которой попросту не существует.

В любом случае правила прекомпиллятора прописьІваются в Custom Build студии, так что всегда можно найти откуда растут ноги - смотреть в Output'е запускается ли Custom Build в принципе. И если запускается - попробовать повторить то же самое в консоли.


Название: Проблемы с moc !!!
Отправлено: Natalie от Январь 13, 2006, 12:36
Что-то я никак не могу понять как создать .pro файл.

В Windows Commander написала qmake -project. Файл QtAttempt.pro создался. Надо ли еще что-то сделать (как-то подключить этот файл...) ?

Steven_Orko, можешь, пожалуйста, пояснить как:
   - создать проект Qt, удалив проект SV.
   - пересоздать проект VS на основе проекта Qt.

Я еще никогда с этим не встречалась. Как это все проделать?

добавлено спустя 23 минуты:

 после  qmake -project  сделала так:
Qt->Open Solusion from .pro File и перегенерила файл QtAttempt.vsproj
И все заработало.

Как я поняла под
- создать проект Qt, удалив проект SV.
- пересоздать проект VS на основе проекта Qt.
это и имелось в виду?


Название: Проблемы с moc !!!
Отправлено: Dendy от Январь 13, 2006, 14:08
По ходу да. Дело в том, что одним наличием файлов в проекте не ограничишься. Всё завязано на том, что прописано в Custom Build студии. Если временньІе папки из pro-файла меняются елементарно, то в студии они остаются такими какими бьІли при добавлении файла в проект. Наверное единственньІй способ перебить Custom Build - удалить и добавить заново все файльІ либо пересоздать проект из pro-файла.

Именно из-за етих непоняток не пользуюсь Qt Integration.

Рекомендую взять на вооружение простой способ:

- вьІделяем в проекте все h-файльІ, заходим в их свойства и пишем что-то вроде:
Код:
$(qtdir)/bin/moc.exe -I"$(qtdir)/include" $(InputDir)$(InputFileName) -o your_temporary_folder/moc_$(InputName).cpp
MOC'ing $(InputFileName) ...
your_temporary_folder/moc_$(InputName).cpp


- аналогично для исходников:
Код:
$(qtdir)/bin/moc.exe -DQT3_SUPPORT $(InputDir)$(InputName).cpp -o your_temporary_folder/$(InputName).moc
MOC'ing $(InputName).cpp ...
your_temporary_folder/$(InputName).moc


- аналогично для ресурсов:
Код:
$(qtdir)/bin/rcc.exe -name $(InputName) $(InputDir)$(InputFileName) -o your_temporary_folder/qrc_$(InputName).cpp
RCC'ing $(InputFileName) ...
your_temporary_folder/qrc_$(InputName).cpp


- аналогично для форм:
Код:
$(qtdir)/bin/uic.exe $(InputDir)$(InputFileName) -o your_temporary_folder/ui_$(InputName).h
UIC'ing $(InputFileName) ...
your_temporary_folder/ui_$(InputName).h


 :D  ;)

Единственная нужная вещь в интеграторе - Debug Extentions, но и она делается руцями, добавив кусок кода в autoexp.dat.


Название: Проблемы с moc !!!
Отправлено: Natalie от Январь 13, 2006, 14:21
Большое ВСЕМ спасибо    :D


Название: Проблемы с moc !!!
Отправлено: Steven_Orko от Январь 13, 2006, 18:27
to Natalie:
Ну вот  и разобрались в проблемме ))))
to Dendy:
Согласен с тобой, что в общем случае было бы гораздо лучше с разных точек зрения пользоваться своими makefile и  Custom Build, причем настроенными тобою же. Но в данном случае было проще сделать выше описанные пункты, т.к. они понятнее (ИМХО).


Название: Проблемы с moc !!!
Отправлено: Dendy от Январь 13, 2006, 18:47
Свой Makefile - ето через чур! :D  Гораздо круче наловчиться писать pro-файльІ, вот где действительно сила и кроссовость.

Жалко, что нет исходников Qt интегратора, как бьІло для Студии 6. Тогда можно бьІло легко найти ошибки и подправить. Или я чего-то не знаю...

ЕдинственньІй найденньІй мной недостаток студии перед консолью - невозможность натравить злочастньІй moc на cpp-файл, ибо правило для файла можно задать только одно. Или я опять же чего-то не знаю...


Название: Проблемы с moc !!!
Отправлено: Steven_Orko от Январь 13, 2006, 18:56
Ну, не знаю, как в винде, но я натравливал moc в Линуксе и на хедер и на cpp. Если использовать перенаправление вывода, то создаст новый отmocаный файл. Но это я все по поводу консоли )))) :D  по поводу исходников интегратора... не знаю, есть ли они, но было бы круто, если бы кто нашел )))