Problem mit eigenem Widget (symbol(s) not found)

Alles rund um die Programmierung mit Qt
klaus85
Beiträge: 20
Registriert: 5. Oktober 2010 16:54

Problem mit eigenem Widget (symbol(s) not found)

Beitrag von klaus85 »

Hallo,
ich habe ein eigenes Widget von QTableWidget abgeleitet. Es taucht auch im Designer auf. Wenn ich es jetzt allerdings in ein Projekt einbinde, kompiliert es nicht mehr. Hier die Fehlermeldung (unter "Build-Probleme"):
symbol(s) not found.
collect2: ld returned 1 exit status
und unter "Kompilierung":
ld: warning: directory '/tmp/qt-stuff-6474/source/qt-everywhere-opensource-src-4.7.0/lib' following -L not found
ld: warning: directory '/tmp/qt-stuff-6474/source/qt-everywhere-opensource-src-4.7.0/lib' following -F not found
Undefined symbols:
"MyTableWidget::MyTableWidget(QWidget*)", referenced from:
Ui_MyDialog::setupUi(QDialog*) in mydialog.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [myapp.app/Contents/MacOS/MyApp] Error 1
make: Leaving directory `/Users/klaus/MyApp-build-desktop'
Der Prozess "/usr/bin/make" wurde mit dem Rückgabewert %2 beendet.
Fehler beim Erstellen des Projekts MyApp(Ziel: Desktop)
Bei der Ausführung von Build-Schritt 'Make'
Erst gab es Probleme mit dem header meines Widgets, die hab ich aber gelöst (fand ihn nicht -> in INCLUDELIBS den Pfad eingebaut -> geht), aber jetzt hänge ich hier fest.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wie immer - bitte minmales Beispiel und wir können helfen...
Ich schätze die erzeugte ui_MyDialog.h ist defekt - make clean könnte ggf. schon helfen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
klaus85
Beiträge: 20
Registriert: 5. Oktober 2010 16:54

Beitrag von klaus85 »

Nicht mal die einfachste Variante klappt. Hier der Code von meinem Widget (bei den plugin-dateien alles gelassen, so wie's automatisch erstellt wurde). Das Widget dann einfach in irgendein leeres Projekt ziehen und das dann kompilieren -> o.g. Fehler...

mytablewidget.h

Code: Alles auswählen

#ifndef MYTABLEWIDGET_H
#define MYTABLEWIDGET_H

#include <QTableWidget>

class MyTableWidget : public QTableWidget
{
    Q_OBJECT

public:
    MyTableWidget(QWidget *parent = 0);
};

#endif
mytablewidget.cpp

Code: Alles auswählen

#include "mytablewidget.h"


MyTableWidget::MyTableWidget(QWidget *parent) :
    QTableWidget(parent)
{
}
Zuletzt geändert von klaus85 am 15. Oktober 2010 12:58, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ui_MyDialog::setupUi() kommt doch von Deinem Plugin - also wird dort wohl der Fehler liegen...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Boah um was für Zeiten schreibst du ..... ;)

Sieht für mich aus als ob du net gegen das Plugin gelinkt bist...
klaus85
Beiträge: 20
Registriert: 5. Oktober 2010 16:54

Beitrag von klaus85 »

Ui_MyDialog::setupUi() ist im Dialog, der mein Widget enthält.

Wie link ich gegen das Plugin?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Du musst nicht gegen das Plugin linken sondern im Plugin fehlt einfach die Funktion Ui_MyDialog::setupUi() - warum auch immer ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
klaus85
Beiträge: 20
Registriert: 5. Oktober 2010 16:54

Beitrag von klaus85 »

ich hab in dem Plugin aber nirgends einen Dialog....
Wie schon gesagt, in diesem Ui_MyDialog::setupUi() wird mein Widget mit new MyTableWidget erstellt...
hier auch noch der Code von meinem Plugin...
MyTableWidgetPlugin.h

Code: Alles auswählen

#ifndef MYTABLEWIDGETPLUGIN_H
#define MYTABLEWIDGETPLUGIN_H

#include <QDesignerCustomWidgetInterface>

class MyTableWidgetPlugin : public QObject, public QDesignerCustomWidgetInterface
{
    Q_OBJECT
    Q_INTERFACES(QDesignerCustomWidgetInterface)

public:
    MyTableWidgetPlugin(QObject *parent = 0);

    bool isContainer() const;
    bool isInitialized() const;
    QIcon icon() const;
    QString domXml() const;
    QString group() const;
    QString includeFile() const;
    QString name() const;
    QString toolTip() const;
    QString whatsThis() const;
    QWidget *createWidget(QWidget *parent);
    void initialize(QDesignerFormEditorInterface *core);

private:
    bool m_initialized;
};

#endif
MyTableWidgetPlugin.cpp

Code: Alles auswählen

#include "mytablewidget.h"
#include "mytablewidgetplugin.h"

#include <QtCore/QtPlugin>

MyTableWidgetPlugin::MyTableWidgetPlugin(QObject *parent)
    : QObject(parent)
{
    m_initialized = false;
}

void MyTableWidgetPlugin::initialize(QDesignerFormEditorInterface * /* core */)
{
    if (m_initialized)
        return;

    // Add extension registrations, etc. here

    m_initialized = true;
}

bool MyTableWidgetPlugin::isInitialized() const
{
    return m_initialized;
}

QWidget *MyTableWidgetPlugin::createWidget(QWidget *parent)
{
    return new MyTableWidget(parent);
}

QString MyTableWidgetPlugin::name() const
{
    return QLatin1String("MyTableWidget");
}

QString MyTableWidgetPlugin::group() const
{
    return QLatin1String("");
}

QIcon MyTableWidgetPlugin::icon() const
{
    return QIcon();
}

QString MyTableWidgetPlugin::toolTip() const
{
    return QLatin1String("");
}

QString MyTableWidgetPlugin::whatsThis() const
{
    return QLatin1String("");
}

bool MyTableWidgetPlugin::isContainer() const
{
    return false;
}

QString MyTableWidgetPlugin::domXml() const
{
    return QLatin1String("<widget class=\"MyTableWidget\" name=\"myTableWidget\">\n</widget>\n");
}

QString MyTableWidgetPlugin::includeFile() const
{
    return QLatin1String("mytablewidget.h");
}

Q_EXPORT_PLUGIN2(mytablewidgetplugin, MyTableWidgetPlugin)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Langsam gebe ich echt auf... :roll:
Wo auch immer es erstellt wird - bei der daraus resultierenden Library fehlt diese Funktion. Also musst Du schauen
- wo diese Funktion ist (wohl in der ui_wasauchimmer.h)
- ob sie mit kompiliert wird
- ob sie ggf. outdated ist.

Mit einem minimal kompilierbaren Beispiel könnte man ja mal schauen aber immer nur ein paar Brocken...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
klaus85
Beiträge: 20
Registriert: 5. Oktober 2010 16:54

Beitrag von klaus85 »

was willst du denn bitte mehr? du hast hier das komplette widget, das sich kompilieren lässt.
im designer -> neues projekt -> Benutzerdefiniertes Widget für QT Designer -> meinen Code nehmen
dann noch ein GUI, wo du NUR das Widget einbindest und dann kompilierst (und dann der kommt der fehler) brauch ich doch nicht geben, das sind 2 klicks im designer...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Code: Alles auswählen

Undefined symbols: 
"MyTableWidget::MyTableWidget(QWidget*)", referenced from: 
Ui_MyDialog::setupUi(QDialog*) in mydialog.o 
ld: symbol(s) not found 

Code: Alles auswählen

MyTableWidget::RettungsmittelTableWidget(QWidget *parent) : 
    QTableWidget(parent) 
{ 
} 
Es ist nicht die setupUi, die nicht gefunden wird, sondern MyTableWidget::MyTableWidget (welche in setupUi gebraucht wird).
Wenn du dir deine .cpp anschaust, weiß du auch warum :
MyTableWidget::RettungsmittelTableWidget() ist was GANZ anderes (kein Konstruktor, sondern eine normale Methode deiner Klasse)! Du hast wahrscheinlich dein Widget umbenannt, aber den Konstruktor vergessen...
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Ist doch nachvollziehbar:
"MyTableWidget::MyTableWidget(QWidget*)", referenced from:
Ui_MyDialog::setupUi(QDialog*) in mydialog.o
Der Designer ist glücklich, hat eine ui-Datei erstellt, aus der *.ui wurde eine *.h erzeugt welche sogar kompilierbar ist.
Beim Linken fehlt nun der CTor..

Also: AuE hat die Lösung schon lange geschrieben.

[EDIT]
Ich interpretiere "MyTableWidget::RettungsmittelTableWidget()" als einen Schreibfehler, weil 1. der Code im vollständigen Beispiel korrekt ist und 2. weil das gar nie kompiliert und klaus daher keinen Linkerfehler sondern einen Compilerfehler gehabt hätte.
klaus85
Beiträge: 20
Registriert: 5. Oktober 2010 16:54

Beitrag von klaus85 »

franzf hat geschrieben:

Code: Alles auswählen

Undefined symbols: 
"MyTableWidget::MyTableWidget(QWidget*)", referenced from: 
Ui_MyDialog::setupUi(QDialog*) in mydialog.o 
ld: symbol(s) not found 

Code: Alles auswählen

MyTableWidget::RettungsmittelTableWidget(QWidget *parent) : 
    QTableWidget(parent) 
{ 
} 
Es ist nicht die setupUi, die nicht gefunden wird, sondern MyTableWidget::MyTableWidget (welche in setupUi gebraucht wird).
Wenn du dir deine .cpp anschaust, weiß du auch warum :
MyTableWidget::RettungsmittelTableWidget() ist was GANZ anderes (kein Konstruktor, sondern eine normale Methode deiner Klasse)! Du hast wahrscheinlich dein Widget umbenannt, aber den Konstruktor vergessen...
das sollte natürlich auch hier

Code: Alles auswählen

MyTableWidget::MyTableWidget(QWidget *parent) : 
    QTableWidget(parent) 
{ 
}
heißen (oben geändert, so wie's bei mir im Code ist)... Der Konstruktor ist also schon da... Ich hab hier im Forum die Klasse anders genannt als bei mir im Code und die Zeile vergessen zu ändern...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Die ganzen 'My's bringen einen total durcheinander.
Also was Du gebaut hast ist nur ein Plugin für den Designer. Was Du aber willst ist eine Shared Library gegen die Du linkst. Das sind eigentlich zwei verschiedene Dinge. Man kann es auch in einer Lib zusammenfassen (das was Du quasi schon hast) aber normalerweise macht man das nicht. Es gibt meist eine lib<Name>.so gegen die man linkt und eine lib<Name>_designer.so als Designer-Plugin.
Du hast also einfach vergessen gegen die Library zu linken.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
klaus85
Beiträge: 20
Registriert: 5. Oktober 2010 16:54

Beitrag von klaus85 »

danke, aber wie mach ich das? gibt's da irgendwo was, wo das einfach beschrieben wird, wie ich mir ein eigenes widget bastel? ich hab das beispiel vom assistant mit dieser analogworldtimeclock (oder so) verwendet.
bei mir wird nur diese "libmytablewidgetplugin.dylib" erstellt (OS X), die ich dann in den Designer-Ordner tu, um sie im Designer zu haben. Dann hab ich noch meinen INCLUDEPATH += /Users/klaus/RettungsmittelTableWidget zum header, mehr nicht...
Antworten