Qt Custom Widget Plugin Linker Error 2019

Alles rund um die Programmierung mit Qt
Antworten
mdmr
Beiträge: 18
Registriert: 4. April 2010 15:01

Qt Custom Widget Plugin Linker Error 2019

Beitrag von mdmr »

Hallo,

eventuell hat einer eine Idee?

Ich habe mit dem Assistenten ein Custom Widget erstellt. Der Qt Designer hat das Plugin geladen und ich kann es im Designer verwenden.
Das Plugin besteht aus zwei Dingen, der "Wrapper Klasse" für den Designer und der eigentlichen lib. Die Lib enthält eigentlich nur ein Webview, bzw ist davon abgeleitet. Sonst habe ich mich an den generierten Code gehalten.

Im Main Project habe ich die Lib und den Header der eigentlichen Lib hinzugefügt. Die Pfade für Include und Lib sind auch gesetzt.
Die Lib wird auch gefunden, ich bekomme aber einen Linker Error, nicht aufgelöstes Symbol.

Zum Test habe ich alle Abhängigkeiten der Lib auch im Main Projekt hinzugefügt, leider ohne Erfolg.

Habe ich da jetzt einen Denkfehler mit dem Linken gegen die Lib oder muss ich die Dll einbinden? Ich gehe davon aus, dass die Dll für den Designer ist?

Statt Pragma Comment Lib habe ich die Libs manuell hinzugefügt. Mit beidem bin ich eigentlich gut vertraut.

Natürlich könnte ich einfach in der Main App direkt ein Webview verwenden, dass funktioniert auch. Der Hintergrund ist, dass ich aktuell eine Alternative zu MFC + .net suche. Dabei sollten mehrer, ziemlich komplexe Ui´s aus wiederverwendbaren Komponenten erstellt werden. Daher die Überlegung zu Qt und Custom Widget Plugins.

Grüßle

Mdmr
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Qt Custom Widget Plugin Linker Error 2019

Beitrag von Christian81 »

Und was genau wird nicht gefunden?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mdmr
Beiträge: 18
Registriert: 4. April 2010 15:01

Re: Qt Custom Widget Plugin Linker Error 2019

Beitrag von mdmr »

Hallo Christian,

vielen Dank für Deine Antwort.

Ich habe gerade nochmal ein Custom Designer Widget erstellt. Um auszuschließen, dass es mit dem Web Steuerelement Schwierigkeiten gibt.

Das neue Widget hat nur einen Button, ein Label und eine Textbox und wird im Designer korrekt angezeigt.

Q_OBJECT ist gesetzt, im Widget wie auch in der Main App.
Lib und Include Pfade habe ich zur Sicherheit absolut gesetzt.
Vor dem Setzen der Pfade und dem setzen der Abhängigkeit zur Lib habe ich jeweils versucht zu kompilieren um die Schritte der Änderung zu bestätigen.

Visual Studio 2017 mit Qt Autoinstaller für Windows und Visual Studio Plugin. Versucht in x64 Debug und Release, vorher das Libprojekt jeweils neu erstellt und die Inkludepfade entsprechend angepasst.

Verwende ich ein normales Widget aus dem Designer funktioniert alles.

Fehler LNK2019 Verweis auf nicht aufgelöstes externes Symbol "
"public: __cdecl QtDesignerWidgetTest::QtDesignerWidgetTest(class QWidget *)" (??0QtDesignerWidgetTest@@QEAA@PEAVQWidget@@@Z)"

in Funktion ""public: void __cdecl Ui_CWidgetTestAppClass::setupUi(class QMainWindow *)" (?setupUi@Ui_CWidgetTestAppClass@@QEAAXPEAVQMainWindow@@@Z)". QtGuiApplication1

Wenn ich nicht den Weg über den Designer gehe sondern direkt ein Instanz vom Testwidget instanziere funktioniert es auch nicht.

public: __cdecl QtDesignerWidgetTest::QtDesignerWidgetTest(class QWidget *)" (??0QtDesignerWidgetTest@@QEAA@PEAVQWidget@@@Z)" in Funktion ""public: __cdecl CWidgetTestApp::CWidgetTestApp(class QWidget *)" (??0CWidgetTestApp@@QEAA@PEAVQWidget@@@Z)



Grüßle
mdmr
Beiträge: 18
Registriert: 4. April 2010 15:01

Re: Qt Custom Widget Plugin Linker Error 2019

Beitrag von mdmr »

Vielen Dank aber ich habe das Problem inzwischen gelöst:

Die Vorlage QtDesignerCustom Widget erstellt eine dll und ein lib. Diese Lib ist nicht zu gebrauchen, keine Ahnung warum die erstellt wird, der Designer kann damit auch nichts anfangen. Die Voreinstellung im Projekt ist dll.

Diese Dll wird vom Designer verwendet, dll im Releasemode und Plattform vom Designer erstellen.

Nach Erstellung die dll in den QtPfad ~\Qt\5.10.0\msvc2017_64\plugins kopiere und im Designer unter Hilfe -> Plugins aktualisieren.

Dann die Projekteigenschaften auf statische Lib ändern und neu erstellen. Diese Lib funktioniert dann auch.


Grüßle aus Berlin
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Qt Custom Widget Plugin Linker Error 2019

Beitrag von Christian81 »

Die lib zur DLL ist eine Import-Lib in der alle zu exportierenden Symbole der DLL zu finden sind. Diese wird vom Linker benötigt um gegen die DLL linken zu können.
Eine statische Lib enthält den kompletten Code der Library.
Der Designer benötigt natürlich die DLL - sonst wäre es ja kein Plugin...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mdmr
Beiträge: 18
Registriert: 4. April 2010 15:01

Re: Qt Custom Widget Plugin Linker Error 2019

Beitrag von mdmr »

Hallo Christian,

vielen Dank für die Info.

Wenn ich die richtig verstehe müsste die Lib ja in meinem Project verwendet werden können, ohne dass ich separat eine neue erstelle.

Aktuell ergibt sich aus meinem Vorgehen die Herausforderung, dass es nur im Release Mode funktioniert. Also das erneute Kompilieren als lib. Vermutlich weil der Designer nur eine Release dll verwenden kann, der generierte Code der Ui Datei ernthält jedoch keinen Hinweis auf Debug oder Release.

Hier ein kleiner Auszug, keine Magics:

Code: Alles auswählen

 <item>
 Im Layout Bereich 
      <widget class="QtDesignerWidgetTest" name="qtDesignerWidgetTest"/>
     </item>
      <customwidgets>
  <customwidget>
   <class>QtDesignerWidgetTest</class>
   <extends>QWidget</extends>
   <header>QtDesignerWidgetTest.h</header>
  </customwidget>
 </customwidgets>
     
Wenn ich eine neues Projekt anlege, eine lib ohne Designer Plugin Anteil, kann ich das Widget im Debug und Release Mode verwenden. Allerdings nur ohne Designer.

Das muss doch irgenwie funktionieren, Qt macht es ja selbst auch. Das QWebengineView wird als Custom Widget mit ausgeliefert. Ich muss nur den Header einbinden und gegen die Lib linken wenn ich es im Designer verwendet habe. Das funktioniert im Debug und im Release Mode, jeweils mit der entsprechenden lib.

Hier mal die Header vom Plugin und dem Widget:
Plugin:

Code: Alles auswählen

#pragma once
#include <QtUiPlugin/QDesignerCustomWidgetInterface>

class QtDesignerWidgetTestPlugin : public QObject, public QDesignerCustomWidgetInterface
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetInterface" FILE "qtdesignerwidgettestplugin.json")
    Q_INTERFACES(QDesignerCustomWidgetInterface)

public:
    QtDesignerWidgetTestPlugin(QObject *parent = Q_NULLPTR);

    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 initialized;
};
Widget:

Code: Alles auswählen

#pragma once

#include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit>

class QtDesignerWidgetTest : public QWidget
{
    Q_OBJECT

public:
    QtDesignerWidgetTest(QWidget *parent = Q_NULLPTR);

    QLabel *label;
    QVBoxLayout *layout;
    QPushButton *btn;
    QLineEdit *line;

private slots:
void setText();

    
};
Fehlt da noch ein Macro oder mache ich beim Linker einen Denkfehler?

Grüßle
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Qt Custom Widget Plugin Linker Error 2019

Beitrag von Christian81 »

Der Designer ist im Release-Mode erstellt, also kann er (unter Windows) nur die Release Dll laden.
Deine App wird, vor allem beim Entwickeln, im Debug-Mode erstellt, also ist auch die Debug-Dll nötig. Damit man sie sich nicht ständig überschreibt und es Probleme gibt, erzeugt qmake eigentlich immer die Debug-Libnamen mit einem 'd' am Ende. Ob dies automatisch passiert oder nicht kann ich gerade nicht sagen - benutze qmake nicht. Ein Hinweis im Netz schaut so aus:

Code: Alles auswählen

 CONFIG += debug_and_release

 CONFIG(debug, debug|release) {
     mac: TARGET = $$join(TARGET,,,_debug) 
     win32: TARGET = $$join(TARGET,,,d)
 }
 
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mdmr
Beiträge: 18
Registriert: 4. April 2010 15:01

Re: Qt Custom Widget Plugin Linker Error 2019

Beitrag von mdmr »

Hallo Christian,

soweit korrekt, der Designer verwendet nur eine Release Version.

Das Widget wird im Designer auch korrekt angezeigt und wird in der UI Datei verwendet. In diesem Fall erhalte ich im Debug und auch im Release Mode einen Linker Error.

Erstelle ich nur eine lib ohne Designer Pluging, kann ich im Release Mode dagegen linken. Das Widget kann ich dann nur manuell erstellen. Auch dabei gibt es im Debug Mode einen Linker Error. Die Lib habe ich im Debug und Release Mode erstellt und jeweils die richtige gelinkt. Im Widget und in der App habe ich im Debug Mode jeweils die Qt ...d libs gelinkt.

Zum Test habe ich das im Qt Creator alles neu erstellt, ergibt das gleiche Problem.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Qt Custom Widget Plugin Linker Error 2019

Beitrag von Christian81 »

Und was für einen Linker-Fehler? War meine Frage schon im ersten Post...
Und ja, das Plugin und die Widget-Dlls sollten eigentlich zwei verschiedene DLLs sein. In einer macht das keinen Sinn zumal der Designer das Plugin woanders erwartet als eine normale DLL liegen muss
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten