Qt, VS2005, Qwt - Невозможно использовать Q_OBJECT в классе, производном от виджетов Qwt - PullRequest
5 голосов
/ 07 января 2010

Мы скомпилировали QT 4.6 и QWT 5.2.0 для VS2005.

Мы пытаемся извлечь класс из QwtDial, а у производного класса есть слоты. Итак, нам нужно добавить макрос Q_OBJECT. Однако, когда мы делаем это, компоновщик отключает эту ошибку:

ошибка LNK2001: неразрешенный внешний символ "public: static struct QMetaObject const QwtDial :: staticMetaObject" (? StaticMetaObject @ QwtDial @@ 2UQMetaObject @@ B)

Я смотрел на Qwt.dll с зависимости, и у него есть эта функция. Просмотр файла .lib с помощью шестнадцатеричного редактора показывает, что он точно соответствует этой искаженной строке.

У нас есть библиотека Qwt в пути. На самом деле, если я переименую библиотеку, то выдает ошибку, что не может найти файл библиотеки. Итак, мы знаем, что он смотрит на правильную библиотеку.

Если мы пропустим Q_OBJECT, то все будет правильно соединено и прорисовано с использованием нескольких виджетов QWT, включая наши не производные от Q_OBJECT классы Qwt.

Кто-нибудь знает, что может вызвать эту действительно раздражающую проблему компоновщика?

UPDATE:

Я убедился, что класс, к которому я добавляю Q_OBJECT, определенно получает сгенерированный для него файл MOC. Ошибка компоновщика фактически исходит из этого сгенерированного файла MOC:

moc_GaugeWidget1.obj : error LNK2001: unresolved external symbol "public: static
    struct QMetaObject const QwtDial::staticMetaObject" 
    (?staticMetaObject@QwtDial@@2UQMetaObject@@B)

Итак, это выглядит как нечто совершенно странное и нетипичное. Символ определенно находится в библиотеке.

Ответы [ 5 ]

11 голосов
/ 19 января 2010

У меня такая же проблема. Ну, я обновляю старый проект с использованием Qt4.4 и VC2003, и я использую QwtPlot вместо QwtDial. Ошибка:

LNK2001: неразрешенный внешний символ "public: static struct QMetaObject const QwtPlot :: staticMetaObject" (? StaticMetaObject @ QwtPlot @@ 2UQMetaObject @@ B)

Только это. Ничего больше. Я нашел ссылки на форумах, указывающие на проблемы с отладкой / выпуском релизов и, возможно, что-то связанное с удалением плагина Qt Designer.

Кажется, это работает для меня: Добавьте строку: «DEFINES + = QWT_DLL» в начало файла project.pro.

qmake project.pro

nmake release

1 голос
/ 05 июля 2010

Точно такая же проблема здесь с qwt 5.2.1, qt 4.6 и VS2008. тот же код прекрасно компилируется в Linux. Все файлы moc правильно сгенерированы и обработаны, смешанных библиотек выпуска / отладки нет, я собираюсь сообщить об этом в qwt об ошибках, когда у меня будет время.

добавление QWT_DLL в список определений (свойства проекта-> c ++ -> препроцессор-> определения) действительно решает проблему!

1 голос
/ 21 апреля 2010

Проблема в файле moc. Вы должны использовать Q_DECL_EXPORT (или что-то подобное) в определении QwtPlot, который сообщает компилятору, что этот класс может использоваться другой библиотекой, но части класса, сгенерированные в файле moc, не содержат их, поэтому когда вы связываете эту библиотеку с другой программой, она не знает, как связать эти части. В любом случае, я понятия не имею, как сказать это Qt!

1 голос
/ 08 января 2010

Я не уверен в этом ответе, но вот некоторые сведения:

Мне кажется, что у вашего производного класса нет соответствующего файла moc_! Файлы moc обычно используются при использовании макроса Q_OBJECT ... Информация moc вашего проекта хранится в файлах Makefile, Makefile.debug и Makefile.release! Именно этот файл сообщает, каким файлам .cpp нужен файл moc, а какие нет.

Вы можете найти документацию по МО в QtAssistant: http://qt.nokia.com/doc/4.6/moc.html

Теперь, чтобы проверить это, вам нужно зайти в вашу «сгенерированную» папку и найти файл с именем «moc_yourDerivedClass.cpp».

Если вы не можете найти подходящий файл, вам нужно снова пройти процесс qmake с yourderivedClass ... Может быть, когда вы впервые использовали qmake, макрос Q_OBJECT еще не был в классе и, следовательно, нет файла moc был создан ...

Надеюсь, это вам немного поможет!

0 голосов
/ 17 апреля 2011

Попробуйте снова запустить qmake в каталоге проекта.

$ qmake -project

$ qmake -tp vc

Это то, что исправило проблему для меня. Прочитав объяснения «похоже, у вас проблема с moc-файлом», которые дали многие люди, я не понял, что делать.

Я думаю, что я вызвал свои собственные проблемы на этом, хотя. Я щелкнул правой кнопкой мыши и скомпилировал файл .ui в своем проекте перед сборкой всего проекта. Каким-то образом это не полностью сгенерировало все необходимые файлы. В любом случае, запуск qmake полезен, если вы вдруг столкнетесь с проблемами, которых раньше не было.

Однако в настройках проекта я заметил еще одну вещь: ни одна из директив препроцессора не была установлена. Запуск qmake снова исправил это.

...