Мы скомпилировали 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)
Итак, это выглядит как нечто совершенно странное и нетипичное. Символ определенно находится в библиотеке.