2010-01-07 12 views
5

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.

Odpowiedz

11

Mam ten sam problem. Cóż, aktualizuję stary projekt przy użyciu Qt4.4 i VC2003 i używam QwtPlot zamiast QwtDial. Błąd jest:

LNK2001: nierozwiązanych zewnętrznych symbolu "public: static struct QMetaObject const QwtPlot :: staticMetaObject" (staticMetaObject @ QwtPlot @@ 2UQMetaObject @@ B?)

tylko to. Nic więcej. Znalazłem odniesienia do forum wskazujące na problemy z miksowaniem debugowania/wydania i prawdopodobnie coś związanego z usunięciem wtyczki Qt Designer.

Działa to dla mnie: Dodaj wiersz: "DEFINES + = QWT_DLL" na początku pliku project.pro.

QMake project.pro

nUpewnij zwolnić

+1

+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. –

+0

Dziękuję, to działa! –

1

nie jestem pewien o tej odpowiedzi, ale tu są pewne informacje:

Wydaje mi się, że klasa pochodna nie ma pasujący moc_ pliku! Pliki moc są zwykle używane podczas używania makra Q_OBJECT ... Informacje o projekcie twojego projektu są przechowywane w plikach Makefile, Makefile.debug i Makefile.release! Ten plik informuje, które pliki .cpp wymagają pliku moc, a które nie.

można znaleźć dokumentację na MOC w QtAssistant: http://qt.nokia.com/doc/4.6/moc.html

Teraz, aby to sprawdzić, trzeba iść w swój „generowane” folder i szukać pliku o nazwie „moc_yourDerivedClass.cpp”.

Jeśli nie możesz znaleźć żadnego pasującego pliku, musisz powtórzyć proces qmake z yourderivedClass ... Być może po pierwszym użyciu qmake, makro Q_OBJECT nie było jeszcze w klasie i dlatego nie ma mocy Plik został utworzony ...

Mam nadzieję, że ci to pomoże!

+0

Proponuję ci coś, prawdopodobnie nie jest to możliwe do zrealizowania, ale może będzie pomocne w projektach przyszłościowych. Używam pakietu skryptów opracowanego przez mojego znajomego. Znajdziesz go tutaj: http://www.dprog.net/joomla/index.php?option=com_content&view=article&id=39:qt-integration-scripts&catid=32:qt-integration-scripts&Itemid=47 There jest trochę pracy, aby to skonfigurować, np. określenie, który VS używasz, która wersja Qt, gdzie jest twój plik .PRO, itp ... A następnie wszystko inne odbywa się automatycznie, dodając nowe dodane pliki, tworzenie. Pliki PRI, pliki vcproj ... To naprawdę dobre ... –

+0

Z tym pakietem, na przykład, kiedy dodaję plik, umieszczam go w odpowiednim folderze, obok mojego pliku .PRO. Uruchamiam jeden ze skryptów o nazwie "generate_vcproj.bat", a skrypty generują wszystko ... Potem używam "Launch_ide.bat" i mój VS uruchamia się ze wszystkimi ustawieniami (również pliki mocne;)) –

+0

Co do tej odpowiedzi , nie ... jest zdecydowanie plik MOC do tego. (moc_GaugeWidget1.obj: błąd LNK2001: nierozwiązany symbol zewnętrzny "public: static struct QMetaObject const QwtDial :: staticMetaObject" (? staticMetaObject @ QwtDial @@ 2UQMetaObject @@ B)) ... więc, jest jeszcze inny problem/błąd. – darron

1

problem jest z MOC file.You powinien używać Q_DECL_EXPORT (lub jakąś rzecz innego podobnego) w definicji QwtPlot który powie kompilator klasa ta może być wykorzystana przez inną bibliotekę ale części klasy generowane w pliku moc nie zawierają tych elementów, więc gdy łączysz te biblioteki z innymi programami, nie wiesz jak je połączyć. W każdym razie nie mam pojęcia, jak powiedzieć to Qt!

1

Dokładnie ten sam problem tutaj z qwt 5.2.1, qt 4.6 i VS2008. ten sam kod doskonale kompiluje się w Linuksie. Wszystkie pliki moc są poprawnie generowane i przetwarzane, nie ma tam bibliotek mieszanych wydania/debugowania, zgłaszam je do błędów qwt, gdy mam czas.

dodanie QWT_DLL do listy definicji (właściwości projektu-> C++ -> preprocesor-> definicje) rzeczywiście rozwiązuje problem!

0

Spróbuj ponownie uruchomić qmake w katalogu projektu.

$ QMake -Project

$ QMake -tp vc

To właśnie rozwiązaniu problemu dla mnie. Czytanie objaśnień "wygląda na to, że masz problem z kartoteką", wiele osób podało, nie wiedząc, co robić.

Myślę, że jednak spowodowałem swoje własne problemy. Kliknąłem prawym przyciskiem myszy i skompilowałem plik .ui w moim projekcie przed zbudowaniem całego projektu. W jakiś sposób to nie w pełni wygenerowało wszystkie potrzebne pliki. Tak czy inaczej, uruchomienie qmake jest przydatną rzeczą, jeśli nagle napotkasz problemy, których wcześniej nie było.

Jednak w moich ustawieniach projektu zauważyłem jeszcze jedną rzecz, żadna z dyrektyw preprocesora nie została ustawiona. Uruchomiony qmake ponownie naprawił to.

Powiązane problemy