125 votes

"Failed to load platform plugin "xcb" " lors du lancement d'une application qt5 sous linux sans qt installé

J'ai écrit une application pour linux qui utilise Qt5.

Mais lorsque j'essaie de le lancer sous Linux sans Qt SDK installé, la sortie dans la console est la suivante :

Échec du chargement du plugin de plate-forme "xcb". Les plateformes disponibles sont :

Comment puis-je réparer cela ? Peut-être que je dois copier un fichier de plugin ? Lorsque j'utilise ubuntu avec Qt5 installé, mais que je renomme le répertoire Qt, le même problème se produit. Donc, il utilise un fichier du répertoire Qt...

MISE À JOUR : quand je crée dans le répertoire de l'application le dossier "platforms" avec le fichier libqxcb.so L'application ne démarre toujours pas, mais le message d'erreur change :

Impossible de charger le plugin de plateforme "xcb". Les plateformes disponibles sont :

xcb

Comment cela peut-il arriver ? Comment le plugin de plate-forme peut-il être disponible mais ne peut pas être chargé ?

64voto

Abe Mishler Points 662

Utilisez ldd (man ldd) pour afficher les dépendances des bibliothèques partagées. Exécuter ceci sur libqxcb.so

.../platforms$ ldd libqxcb.so

montre que xcb dépend de libQt5DBus.so.5 en plus de libQt5Core.so.5 et libQt5Gui.so.5 (et de nombreuses autres librairies système). Ajoutez libQt5DBus.so.5 à votre collection de librairies partagées et vous devriez être prêt à passer à autre chose.

59voto

bossbarber Points 836

Comme indiqué précédemment, vous devez vous assurer que vous installez les plugins de la plate-forme lorsque vous déployez votre application. Selon la façon dont vous souhaitez déployer les choses, il existe deux méthodes pour indiquer à votre application où se trouvent les plugins de la plate-forme (par exemple platforms/plugins/libqxcb.so) au moment de l'exécution, ce qui peut vous convenir.

La première consiste à exporter le chemin d'accès au répertoire via la variable QT_QPA_PLATFORM_PLUGIN_PATH.

QT_QPA_PLATFORM_PLUGIN_PATH=path/to/plugins ./my_qt_app

o

export QT_QPA_PLATFORM_PLUGIN_PATH=path/to/plugins
./my_qt_app

L'autre option, que je préfère, est de créer un fichier qt.conf dans le même répertoire que votre exécutable. Le contenu de ce fichier serait :

[Paths]
Plugins=/path/to/plugins

Vous trouverez plus d'informations à ce sujet aquí y à l'aide de qt.conf

32voto

J'ai essayé de lancer mon binaire, compilé avec Qt 5.7 sur Ubuntu 16.04 LTS, où Qt est présent. 5.5 est préinstallé. Ça n'a pas marché.

D'abord, j'ai inspecté le binaire lui-même avec ldd comme suggéré ici, et satisfait toutes les dépendances "non trouvées". Ensuite, cette fameuse This application failed to start because it could not find or load the Qt platform plugin "xcb" a été déclenchée.

Comment résoudre ce problème sous Linux

Tout d'abord, vous devez créer platforms où se trouve votre binaire, car c'est l'endroit où Qt recherche la bibliothèque XCB. Copiez libqxcb.so là. Je me demande pourquoi les auteurs des autres réponses ne l'ont pas mentionné.

Alors vous pouvez exécuter votre binaire avec QT_DEBUG_PLUGINS=1 définie pour vérifier quelles dépendances de libqxcb.so ne sont pas satisfaites. (Vous pouvez également utiliser ldd pour cela, comme suggéré dans la réponse acceptée).

La sortie de la commande peut ressembler à ceci :

me@xerus:/media/sf_Qt/Package$ LD_LIBRARY_PATH=. QT_DEBUG_PLUGINS=1 ./Binary
QFactoryLoader::QFactoryLoader() checking directory path "/media/sf_Qt/Package/platforms" ...
QFactoryLoader::QFactoryLoader() looking at "/media/sf_Qt/Package/platforms/libqxcb.so"
Found metadata in lib /media/sf_Qt/Package/platforms/libqxcb.so, metadata=
{
    "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
    "MetaData": {
        "Keys": [
            "xcb"
        ]
    },
    "className": "QXcbIntegrationPlugin",
    "debug": false,
    "version": 329472
}

Got keys from plugin meta data ("xcb")
loaded library "/media/sf_Qt/Package/platforms/libqxcb.so"
QLibraryPrivate::loadPlugin failed on "/media/sf_Qt/Package/platforms/libqxcb.so" : "Cannot load library /media/sf_Qt/Package/platforms/libqxcb.so: (/usr/lib/x86_64-linux-gnu/libQt5DBus.so.5: version `Qt_5' not found (required by ./libQt5XcbQpa.so.5))"
This application failed to start because it could not find or load the Qt platform plugin "xcb"
in "".

Available platform plugins are: xcb.

Reinstalling the application may fix this problem.
Aborted (core dumped)

Notez l'échec libQt5DBus.so.5 bibliothèque. Copiez-la dans le chemin de vos bibliothèques, dans mon cas, c'était le même répertoire que celui où se trouve mon binaire (donc LD_LIBRARY_PATH=. ). Répétez ce processus jusqu'à ce que toutes les dépendances soient satisfaites.

P.S. merci à l'auteur de cette réponse pour QT_DEBUG_PLUGINS=1 .

16voto

Alan Points 498

J'ai essayé les parties principales de chaque réponse, sans succès. Ce qui a finalement réglé le problème pour moi a été d'exporter les variables d'environnement suivantes :

LD_LIBRARY_PATH=/usr/local/lib:~/Qt/5.9.1/gcc_64/lib
QT_QPA_PLATFORM_PLUGIN_PATH=~/Qt/5.9.1/gcc_64/plugins/

11voto

Francesco Points 46

Ubuntu 16.04 64bit. J'ai eu ce problème sans raison apparente. La nuit précédente, j'ai regardé un film sur mon instance VideoLan, cette nuit-là, je voudrais en regarder un autre avec VideoLan. VLC n'a tout simplement pas voulu s'exécuter à cause de l'erreur dans la question. J'ai cherché un peu sur Google et j'ai trouvé la solution qui a résolu mon problème : à partir de maintenant, VLC est exécutable comme avant. La solution est cette commande :

sudo ln -sf /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/ /usr/bin/

Je ne suis pas en mesure d'expliquer quelles sont ses conséquences, mais je sais qu'il crée un lien symbolique manquant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X