Qt5.3.1 app deployment on Linux troubles



  • Hello everyone. I have some troubles when I deploy my app into Linux-platform. Unless specifically the problem lies in the platforms and sqldivers plugins.
    There'r the steps what I did:
    I compiled my app in Linux-platform and it's run perfect via QtCreator.
    Next I temporary renamed some folder in path to Qt environment to disable this environment.
    Next I created a folder e.g. /home/user/bin and replaced my app file, my libs, needed Qt -libs.
    Then I added in .bashrc file LD_LIBRARY_PATH variable:
    .bashrc:
    ...
    LD_LIBRARY_PATH=/home/usr/bin
    export LD_LIBRARY_PATH

    Next I run ldd ./myapp to check libraries needed. All libs present.
    Then I copied platforms and sqldrivers folders to my app folder.
    Finally my distribution looks like:
    platforms
    sqldrivers
    myapp
    libme.so.1
    libQt5Core.so.5
    libQt5Gui.so.5
    ...

    platforms folder:
    libqxcb.so
    libqoffscreen.so
    libqminimal.so
    libqlinuxfb.so

    sqldrivers folder:
    libqsqlmysql.so
    libqsqlite.so

    And when I do ./myapp in bash I see:
    QSqlDatabase: QMYSQL driver not loaded
    QSqlDatabase: available drivers:
    QSqlDatabase: an instance of QCoreApplication is required for loading driver plugins
    This application failed to start because it could not find or load the Qt platform plugin "xcb"

    Then I added QT_QPA_PLATFORM_PLUGIN_PATH=/home/user/bin/platforms. Error messages were changed:
    QSqlDatabase: QMYSQL driver not loaded
    QSqlDatabase: available drivers:
    QSqlDatabase: an instance of QCoreApplication is required for loading driver plugins
    QFontDatabase: Cannot find font directory /home/usr/Qt/qtbase/lib/fonts - is Qt installed correctly?

    At the moment I do not know what to do.


  • Lifetime Qt Champion

    Hi,

    All plugins (except platforms but you already did it right) should go in the plugins subfolder.

    Then you should be good to go



  • I have the same troubles ,and when I set the environment variables:LD_LIBRARY_PATH and QT_QPA_PLATFORM_PLUGIN_PATH,then running the app like this:./imagegesture –plugin EvdevTouch ,the error is still exists:
    This application failed to start because it could not find or load the Qt platform plugin "xcb".
    Reinstalling the application may fix this problem.

    add the QT_DEBUG_PLUGINS=1 ,i see the error exists because of the libxcb.so'version is incompatibale .

    but i have not seen why the parameter "-plugin EdevTouch" has not work but it works in the development enviroment.

    My OS is Fedora20 and Qt is 5.3.1
    thanks!


  • Lifetime Qt Champion

    You don't have the same problem. Your target OS doesn't provide a suitable libxcb version.



  • Thanks to all for help.I found the solution.

    1. We must make visible our libQt5*.so libs and our own libs for runtime. There is 2 ways to do (As I founded):
    • use LD_LIBRARY_PATH env variable;
    • use chrpath utility (this I used).
      I downloaded chrpath utility and change RPATH variable in myapp file.
      $ chrpath -r . myapp
      This allows runtime to check libraries in same directory when our app located (this Windows-like behavior)
      Note. using chrpath -l myapp before changing we can see current RPATH value.
    1. Copy standart Qt plugins (platforms, sqldrivers etc) to defined directories.
    • in my case it was /usr/lib/kde4/plugins (I defined it using "$ export QT_DEBUG_PLUGINS=1" before running my app). It works but we need root permissions.
      I did another way.
      I add code to myapp main()-functions and recompile there (and rewrite RPATH var again)
      @int main(int argc, char** argv)
      {
      QStringList paths = QCoreApplication::libraryPaths();
      paths.append(".");
      paths.append("imageformats");
      paths.append("platforms");
      paths.append("sqldrivers");
      paths.append("fonts");
      QCoreApplication::setLibraryPaths(paths);

      QApplication a(argc, argv);
      ...
      }
      @
      That means that plugins loader see this subfolders in myapp folder and can find plugins standart libraries in this folders.

    1. Solution for QFontDatabase error -
      3.1) Copy fonts folder from ../qt/lib to .../myappfolder
      3.2) Define a QT_QPA_FONTDIR var -
      in my case
      $ export QT_QPA_FONTDIR=/home/usr/myappfolder/fonts
      $ ./myapp
      Thats it.
      We can do a shell script like this:
      @#!/bin/sh
      appname=basename $0 | sed s,\.sh$,,

    dirname=dirname $0
    tmp="${dirname#?}"

    if [ "${dirname%$tmp}" != "/" ]; then
    dirname=$PWD/$dirname
    fi

    #LD_LIBRARY_PATH=$dirname
    #export LD_LIBRARY_PATH

    export QT_QPA_FONTDIR=$dirname/fonts

    $dirname/$appname "$@"@

    Finally myappfolder looks like:
    @

    • fonts folder
    • platforms folder
    • imageformats folder (also copied from qt-folder/plugins)
    • sqldrivers folder
    • myapp.sh
    • myapp
    • libmyown.so.1
    • libQt5*.so.5
    • ...
      @

  • Lifetime Qt Champion

    You should Never (™) copy libraries like that, you might end up overwriting your system's own copy of Qt.


Log in to reply
 

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