Important: Please read the Qt Code of Conduct -

[Solved]QApplication static linkage and plugins

  • Hi everyone,

    I build a Main App/plugin application using qt 5.1 for multi platform purpose.

    In windows, the Main app is statically linked whereas the plugins are dynamically linked (the first one is a requirement, the second more of a choice :) )

    Up until now, everything worked fine.

    Now I want the plugin to be able to show some stuff (mostly configuration...) and everything is not working fine on windows. When I intend to show something i got a "QWidget: Must construct a QApplication before a QPaintDevice". after a little bit of research, i understand that everything relying on a UI must have a instance of QApplication running, so qApp should not be NULL, but it is with my plugins but not my main app.

    Anyone knows how to set/assign a QApplication ?

    thanks in advance :)

  • Moderators

    basically you have nothing to do other than creating an QApplication instance.

    But to get you right:
    Your main app is linked statically against all Qt libs. Only your plugin is loaded dynamically? And this plugin also uses Qt stuff?

  • thanks for your reply,

    if it is possible I prefer to not create a QApplication, but rather use the one from my main application if possible...

    But yes only my plugins are loaded dynamically and yes they use non-ui Qt stuff

  • Moderators

    [quote author="jpalbertini" date="1383577128"]
    But yes only my plugins are loaded dynamically and yes they use non-ui Qt stuff[/quote]
    So how do you link your plugin binary against Qt?
    And what does your plugin do exactly? Doesn't sound like it's non-ui stuff when a QPaintDevice is required...

  • my plugins are dynamically linked against qt

    basically i got two plugin, one which sends arrays of data, the other one sends QImages

  • Moderators

    so this means your application runs with 2 different Qt binaries...

    You should have created a QApplication in your main app, right?

    I still don't know where you are missing the QPaintDevice...

    But nvertheless you shouldn't mix statically and dynamic linked binaries. Either way link all dynamically or statically. I would suggest you also link your "plugins statically":

  • one thing I also forgot to mention is that I have another app, which is dynamically linked against Qt that work fine and plugins can send QImages directly without a problem.

    So my thoughts are that the QCoreApplication::self value is not pass correctly to the plugin with a statically linked app (the qApp macro is NULL)

  • Moderators

    sure it is, when you link your plugin against the dynamically linked version of Qt wherein the QApplication object never gets initialized.

  • Is there a way that I assign it myself ? the self and init() are marked as private so my range of action is kinda limited, without having to rebuilding Qt with some sort of a setInstance method...

  • Moderators

    no ... and don't do it!
    You do want to assign a object from a statically linked address space into a dynamically linked one...
    Doing this you will probably run into another problem sooner or later.

    And also that your application needs 2 Qt distributions doesn't make sense don't you think?

    Link your plugins also statically and you should be fine.

  • ok thanks i'll do that

Log in to reply