QT, VS2005, Qwt - не Могут использовать Q_OBJECT в классе, полученном из виджетов Qwt

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

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

ошибка LNK2001: неразрешенная внешняя ссылка "общественность: статическая структура константа QMetaObject QwtDial:: staticMetaObject" (? staticMetaObject@QwtDial @@ 2UQMetaObject @@ B)

Я посмотрел на Qwt.dll с, зависит, и это имеет ту функцию. Рассмотрение .lib файла с Hex-редактором показывает, что имеет точное совпадение для той искаженной именем строки.

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

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

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

ОБНОВЛЕНИЕ:

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

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

Так, это похоже на что-то вполне stange и нетипичное. Символ находится определенно в lib.

5
задан darron 12 January 2010 в 16:03
поделиться

4 ответа

У меня такая же проблема. Ну, я обновляю старый проект, используя qt4.4 и vc2003, и я использую qwtplot вместо qwtdial. Ошибка:

lnk2001: неразрешенный внешний символ "Общественный: статический структуру QmetaObject const qwtplot :: StaticМетаообъект" (? StaticMetaObject @ qwtplot @ 2UQMetaObject @@ b)

Просто это. Ничего больше. Я нашел форума Ссылки, указывающие на вопросы с помощью Mixups Debug / Release и, возможно, что-то делать с удалением плагина QT Designer.

Это, кажется, работает для меня: Добавьте строку: «Определяет + = QWT_DLL» в верхнюю часть файла Project.pro.

qmake project.pro

rmake Release

11
ответ дан 18 December 2019 в 13:14
поделиться

Я не уверен в этом ответе, но вот некоторая информация:

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

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

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

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

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

1
ответ дан 18 December 2019 в 13:14
поделиться

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

1
ответ дан 18 December 2019 в 13:14
поделиться

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

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

1
ответ дан 18 December 2019 в 13:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: