Мы скомпилировали 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.
У меня такая же проблема. Ну, я обновляю старый проект, используя 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
Я не уверен в этом ответе, но вот некоторая информация:
Мне кажется, что у вашего производного класса нет подходящего файла 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 был создан ...
Надеюсь, это вам немного поможет!
Проблема связана с файлом moc. Вы должны использовать Q_DECL_EXPORT (или что-то подобное) в определении QwtPlot, которое сообщает компилятору, что этот класс может использоваться другой библиотекой, но части класса, сгенерированные в файле moc, не содержат их, поэтому когда вы связываете эту библиотеку с другой программой, она не знает, как связать эти части. В любом случае я понятия не имею, как сообщить об этом Qt!
Точно такая же проблема здесь с qwt 5.2.1, qt 4.6 и VS2008. тот же код отлично компилируется в Linux. Все файлы moc сгенерированы и обработаны должным образом, смешанных библиотек для выпуска и отладки нет, я собираюсь сообщить об этом в qwt, когда у меня будет время.
добавление QWT_DLL в список определений (свойства проекта-> c ++ -> препроцессор-> определения) действительно решает проблему!