Qt resource not showing up in static build...



  • ...when I build my app in debug/dynamic mode, I get one of my resources (an image) displaying just fine. When I build it in release/static, I don't see it.

    I read a page about needing to explicitly reference resources when creating a static library but this is just an executable, so I don't think that applies. Any idea what I'm doing wrong?


  • Lifetime Qt Champion

    Hi,

    Are you talking about Q_INIT_RESOURCE ?



  • Yeah, mentioned here. But, if I'm reading the document correctly, that shouldn't apply to my example.


  • Qt Champions 2016

    @mzimmers
    Hi
    You mean when you produce a static linked .exe ( with our own static compiled Qt) ( not the same as release mode vs debug mode )
    the compiled in qres file does not work?

    And you have it in the project like ?
    alt text



  • @mrjj yes on both counts. I am getting an error message at runtime:

    QPixmap::scaled: Pixmap is a null pixmap

    Here's the code I use to display it:

        QPixmap logo(":/logos/logo1color.svg"); // .svg file created from .png file with http://www.autotracer.org/
        QSize logoSize = ui->logoLabel->size();
        ui->logoLabel->setPixmap(logo.scaled(logoSize, Qt::KeepAspectRatio, Qt::SmoothTransformation));
    

    And again, it's working when built for debug.


  • Qt Champions 2016

    @mzimmers
    Hi, svg is a normally plugin. maybe it was not compiled in ?
    Did you try with a png or a more native image?


  • Qt Champions 2016

    Can you show your project's file structure? It probably is a path issue (difference) between the release and debug builds.


  • Qt Champions 2016

    Also to be clear.
    It does work in statically linked debug version but not in a
    statically linked release version?
    That is odd.
    When you made your statically linkable Qt, you did use release mode?



  • @mrjj yes, I tried other formats...they looked terrible so I went to .svg.

    @kshegunov: project file layout is entirely flat...do I need a subdirectory called /logos?



  • @mrjj not quite: it works in dynamic/debug, but not in static/release. I haven't tried the other permutations yet.


  • Qt Champions 2016

    Aha! So your debug is in fact dynamically linked. Then do the manual resource initialization as @SGaist hinted!



  • @kshegunov sorry - I thought I'd made that clear in my OP.

    I've added this line to my main (my resource file is called "resources.qrc"):

        Q_INIT_RESOURCE(resources);
    

    Still doesn't show, and I'm getting that null pixmap error.


  • Lifetime Qt Champion

    Do you have several resources named like that ?



  • @SGaist I'm not sure what you mean by "named like that," but I only have one .qrc file, and it only has two files in it.


  • Qt Champions 2016

    Okay, can you grab a screenshot from the resource editor? Unless that path is an alias, then you need to put the image into that folder under the project. I personally always alias the things because it feels quite clumsy otherwise ...



  • So I need a subdirectory in my source folder? I'll try that.

    0_1508880996044_resource.PNG

    EDIT: just moved logo to a subfolder, rebuilt and now I'm getting an error:

    [release/qrc_resources.cpp] Error 1

    So I deleted the moved file and re-added it. Still getting the null pixmap error.


  • Qt Champions 2016

    @mzimmers said in Qt resource not showing up in static build...:

    just moved logo to a subfolder, rebuilt and now I'm getting an error:

    Not any subfolder, looking at the screenshot you need a folder called logos under your project root. Then readd the file and I think it should work.



  • @kshegunov no joy.

    0_1508882322220_folder.PNG
    EDIT: put some text in here to separate the pics.
    0_1508882354954_qt.PNG

    But at least now it's missing from both the debug and release versions...


  • Qt Champions 2016

    But now your resource tree looks funny, you have two folders named "logos" there ...?



  • OK, I obviously don't know what's going on here. The resource editor requires me to add a prefix before I can add a file. When I add the file, if it's in a subdirectory, that gets prepended to the file name. This is why you're seeing what appears to be two levels of folders.

    I don't know how to do this differently.


  • Qt Champions 2016

    Ah, okay. That's why I'm saying it's damn clumsy. Add only a / as prefix and then add your file. It should fix the double folder thing.



  • @kshegunov alas, that didn't work, either. You're right, though...this is one awkward interface.


  • Qt Champions 2016

    You mean it didn't fix the double folder thing or you still can't load the image?

    Your resource file should look something like this:
    0_1508885208545_Screenshot_20171025_014608.png

    Then you'd load with :/images/20171022_152431.jpg.



  • Yes my resource file looks similar to yours. The image displays when dynamically built, but not static.


  • Qt Champions 2016

    Could you try with a static/debug just for the sake of it, to be honest I'm at a lost as you seem to have done everything right.



  • Static/debug doesn't display the image, either. So I'm doing something wrong with the inclusion of resources into a static build...?


  • Qt Champions 2016

    Yes, this would be my best guess. Could you look inside the build folder and see if there's a file .rcc named after your qrc file? Perhaps it's not linked with the binary for some reason ...



  • No .rcc files anywhere. Well, thanks for looking; I guess I'll punt on this for awhile.

    I did try another image type (.jpg) just to be sure...same results.

    EDIT: I probably should point out that I have a warning associated with my static version of Qt: "No qmlscene installed." I really can't imagine that this is affecting anything, though.


  • Qt Champions 2016

    No .rcc files anywhere. Well, thanks for looking; I guess I'll punt on this for awhile.

    Sorry I couldn't be more helpful, perhaps someone else might have an idea, something I didn't think of.



  • I wonder...is it possible that this isn't Qt's fault? That the fault is somewhere within the toolchain? I guess I could try to build my app on Linux or a Mac to see...that'll take a little time, though. Just an idea...


  • Qt Champions 2016

    Yes I guess it's a possibility, although probably a remote one. MSVC or MinGW? Because if it's mingw I'd expect it to behave pretty much the same as linux's g++. I'd compile it for you on linux, but the trouble is I don't keep static Qt builds around, I don't believe in static builds so to speak ...

    EDIT:
    Waaaaaiiit!
    Did you load the image plugins in your binary with Q_IMPORT_PLUGIN?



  • @kshegunov it's MinGW. This isn't an area I'm especially knowledgeable in, but it seems that it's the toolchain (specifically the linker) that decides what does and doesn't go into an executable.

    By the way, if you avoid static images, how do you deliver standalone apps to customers?


  • Qt Champions 2016

    @mzimmers said in Qt resource not showing up in static build...:

    By the way, if you avoid static images, how do you deliver standalone apps to customers?

    You can use an install maker
    to deliver the .exe and its support dlls.
    Qt even has its own tool
    http://doc.qt.io/qtinstallerframework/

    Static linking requires a Qt license so many of us , do it via an installer.


  • Qt Champions 2016

    @mzimmers said in Qt resource not showing up in static build...:

    By the way, if you avoid static images, how do you deliver standalone apps to customers?

    One of the ways is to compile them in the binary, but as @mrjj noted you can also use an external (compiled) resource file and also you could possibly use an installer that delivers them raw in folders.
    What about the Q_IMPORT_PLUGIN question?



  • @kshegunov I didn't see your plugin question until now...the answer is no, I didn't do that.

    What exactly is the plug-in here: the .svg file, or the .qrc file that identifies it?


  • Qt Champions 2016

    Aha, it may be the reason why it can't load the image; your issue might've been completely unrelated to the resource file.

    The plugin is a library - and extension to Qt - that is loaded when your program starts. Plugins provide means to access different 3rd party file/image formats, databases and such. It's usually not needed to care about it when you use dynamic Qt build, because Qt will take care to load it at the appropriate time, however because of technical reasons this is not possible when Qt is build statically (and with static plugins) and you need to do the initialization manually.



  • So, I added this to main.cpp:

        Q_IMPORT_PLUGIN(qsvg);
    

    And this to my .pro file:

    QTPLUGIN += qsvg
    

    I now get a build error:

    C:\Users\MZimmers\Qt projects\removed\main.cpp:-1: error: undefined reference to `qt_static_plugin_qsvg()'

    So, do I need to build and use a library in order to take advantage of this feature?


  • Qt Champions 2016

    @mzimmers said in Qt resource not showing up in static build...:

    So, do I need to build and use a library in order to take advantage of this feature?

    Yes, the plugin itself. See what you have in <QtBase>/plugins/imageformats (I have a list of them one of which is libqsvg.so) you should have your plugins there (you'd expect to see .lib files)? If there are not then you haven't built them and that'd be the reason why the linker is complaining.



  • OK, I think we're zeroing in on this. My build of Qt with dynamic libraries is in:

    C:\Qt\5.9.1\mingw53_32\plugins\imageformats

    And all the .dlls are indeed there.

    When I built my static version, I put it in \Qt\Static. Somehow, the 5.9.1 directory remained empty, but I do have a directory:

    C:\Qt\Static\plugins\imageformats

    With all the necessary .a files.

    So, maybe the problem is that I screwed something up when I built my static version of Qt?



  • I think we have a solution:

    I read the 5.0 version of the plugins doc: http://doc.qt.io/qt-5/plugins-howto.html. The wording is a little different, but it seems that the Q_IMPORT_PLUGIN is used when you want to create your own plugins, not use pre-existing ones. So I removed that file and it builds. The static version now displays the .svg.

    Thanks to all who helped...


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.