Opracowaliśmy QT 4.6 i QWT 5.2.0 dla VS2005.Qt, VS2005, Qwt - Nie można używać Q_OBJECT w klasie pochodnej od widgetów Qwt
Próbujemy wyprowadzić klasę z QwtDial, a klasa pochodna ma gniazda. Musimy więc dodać makro Q_OBJECT. Jednak, gdy to zrobimy, łącznik dławi się ten błąd:
błędzie LNK2001: nierozwiązanych zewnętrznych symbolu "public: static struct QMetaObject const QwtDial :: staticMetaObject" (? StaticMetaObject @ QwtDial @@ @@ 2UQMetaObject B)
Sprawdziłem QWt.dll z zależy i ma tę funkcję. Patrząc na plik .lib za pomocą edytora heksadecymalnego, pokazuje on dokładnie dopasowanie tego splątanego łańcucha nazw.
Mamy bibliotekę Qwt na ścieżce. Właściwie, jeśli zmieniam nazwę biblioteki, oznacza to, że nie może znaleźć pliku biblioteki. Wiemy, że patrzy na odpowiednią bibliotekę.
Jeśli pominiemy Q_OBJECT, to wszystko będzie poprawnie łączyło i rysowało za pomocą kilku widgetów QWT, w tym klas pochodnych QWT innych niż Q_OBJECT.
Czy ktoś wie, co może powodować ten naprawdę denerwujący problem linkera?
UPDATE:
I zostały zweryfikowane, że klasa I dodać Q_OBJECT na pewno jest coraz plik MOC wygenerowany dla niego. Błąd łącznik jest rzeczywiście pochodzą z tego wygenerowanego pliku MOC:
moc_GaugeWidget1.obj : error LNK2001: unresolved external symbol "public: static
struct QMetaObject const QwtDial::staticMetaObject"
([email protected]@@[email protected]@B)
Tak, to wygląda jak coś zupełnie Stange i nietypowej. Symbol jest zdecydowanie w lib.
+1: Dzięki, pomogło! Myślę, że nie ma zdefiniowanego przełącznika w QWT. Coś jak "jeśli używasz w tej bibliotece, ustaw QWT_DLL na Q_DECL_EXPORT, w przeciwnym razie ustaw QWT_DLL na pusty". Dlatego powinieneś ustawić QWT_DLL na ręczne opróżnianie, jeśli używasz nagłówków QWT. –
Dziękuję, to działa! –