Usa ldd (man ldd) per mostrare le dipendenze della libreria condivisa. Eseguendolo su libqxcb.so
.../platforms$ ldd libqxcb.so
mostra che xcb dipende da libQt5DBus.so.5 oltre a libQt5Core.so.5 e libQt5Gui.so.5 (e molte altre librerie di sistema). Aggiungi libQt5DBus.so.5 alla tua raccolta di librerie condivise e dovresti essere pronto per andare avanti.
Come è stato pubblicato in precedenza, è necessario assicurarsi di installare i plug-in della piattaforma quando si distribuisce l'applicazione. A seconda di come vuoi distribuire le cose, ci sono due metodi per dire alla tua applicazione dove si trovano i plugin della piattaforma (ad es. piattaforme/plugins/libqxcb.so) in fase di runtime che potrebbero funzionare per te.
Il primo è esportare il percorso nella directory tramite la variabile 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'altra opzione, che preferisco, è creare un file qt.conf nella stessa directory del tuo eseguibile. Il cui contenuto sarebbe:
[Paths]
Plugins=/path/to/plugins
Maggiori informazioni su questo possono essere trovate qui e usando qt.conf
Ho provato ad avviare il mio binario, compilato con Qt 5.7
, su Ubuntu 16.04 LTS dove Qt 5.5
è preinstallato. Non ha funzionato.
All'inizio, ho ispezionato il binario stesso con ldd
come suggerito qui, e "soddisfatto" tutte le dipendenze "non trovate". Poi questo famigerato This application failed to start because it could not find or load the Qt platform plugin "xcb"
è stato generato un errore.
Come risolvere questo problema in Linux
Innanzitutto dovresti creare platforms
directory in cui si trova il tuo binario, perché è il luogo in cui Qt cerca la libreria XCB. Copia libqxcb.so
là. Mi chiedo perché gli autori di altre risposte non ne abbiano parlato.
Quindi potresti voler eseguire il tuo binario con QT_DEBUG_PLUGINS=1
variabile d'ambiente impostata per controllare quali dipendenze di libqxcb.so
non sono "soddisfatti". (Puoi anche usare ldd
per questo come suggerito nella risposta accettata).
L'output del comando potrebbe essere simile a questo:
[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)
Nota il libQt5DBus.so.5
non riuscito biblioteca. Copialo nel percorso delle tue librerie, nel mio caso era la stessa directory in cui si trova il mio binario (da qui LD_LIBRARY_PATH=.
). Ripeti questo processo finché tutte le dipendenze non sono soddisfatte.
P.S. grazie all'autore di questa risposta per QT_DEBUG_PLUGINS=1
.