Utilisez ldd (man ldd) pour afficher les dépendances de la bibliothèque partagée. 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 bibliothèques système). Ajoutez libQt5DBus.so.5 à votre collection de bibliothèques partagées et vous devriez être prêt à passer à autre chose.
Comme indiqué précédemment, vous devez vous assurer d'installer les plug-ins de la plate-forme lorsque vous déployez votre application. Selon la manière dont vous souhaitez déployer les éléments, il existe deux méthodes pour indiquer à votre application où se trouvent les plugins de plate-forme (par exemple, plates-formes/plugins/libqxcb.so) au moment de l'exécution, ce qui peut fonctionner pour vous.
La première consiste à exporter le chemin vers le répertoire via la variable QT_QPA_PLATFORM_PLUGIN_PATH.
QT_QPA_PLATFORM_PLUGIN_PATH=path/to/plugins ./my_qt_app
ou
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 serait :
[Paths]
Plugins=/path/to/plugins
Plus d'informations à ce sujet peuvent être trouvées ici et à l'aide de qt.conf
J'ai essayé de démarrer mon binaire, compilé avec Qt 5.7
, sur Ubuntu 16.04 LTS où Qt 5.5
est préinstallé. Cela n'a pas fonctionné.
Au début, j'ai inspecté le binaire lui-même avec ldd
comme cela a été suggéré ici, et "satisfait" toutes les dépendances "non trouvées". Puis ce fameux This application failed to start because it could not find or load the Qt platform plugin "xcb"
erreur a été générée.
Comment résoudre ce problème sous Linux
Tout d'abord, vous devez créer platforms
répertoire 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 d'autres réponses ne l'ont pas mentionné.
Ensuite, vous voudrez peut-être exécuter votre binaire avec QT_DEBUG_PLUGINS=1
variable d'environnement définie pour vérifier quelles dépendances de libqxcb.so
ne sont pas "satisfaits". (Vous pouvez également utiliser ldd
pour cela comme suggéré dans la réponse acceptée).
La sortie de la commande peut ressembler à ceci :
[email protected]:/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 le défaut libQt5DBus.so.5
bibliothèque. Copiez-le dans le chemin de vos bibliothèques, dans mon cas, c'était le même répertoire où se trouve mon binaire (d'où LD_LIBRARY_PATH=.
). Répétez ce processus jusqu'à ce que toutes les dépendances soient satisfaites.
PS merci à l'auteur de cette réponse pour QT_DEBUG_PLUGINS=1
.