Použijte ldd (man ldd) k zobrazení závislostí sdílené knihovny. Spuštění na libqxcb.so
.../platforms$ ldd libqxcb.so
ukazuje, že xcb závisí na libQt5DBus.so.5 kromě libQt5Core.so.5 a libQt5Gui.so.5 (a mnoha dalších systémových knihoven). Přidejte libQt5DBus.so.5 do své sbírky sdílených knihoven a měli byste být připraveni jít dál.
Jak bylo uvedeno dříve, musíte se ujistit, že při nasazení aplikace nainstalujete zásuvné moduly platformy. V závislosti na tom, jak chcete věci nasadit, existují dva způsoby, jak své aplikaci sdělit, kde jsou zásuvné moduly platformy (např. platformy/plugins/libqxcb.so) za běhu, což vám může vyhovovat.
První je exportovat cestu k adresáři prostřednictvím proměnné QT_QPA_PLATFORM_PLUGIN_PATH.
QT_QPA_PLATFORM_PLUGIN_PATH=path/to/plugins ./my_qt_app
nebo
export QT_QPA_PLATFORM_PLUGIN_PATH=path/to/plugins
./my_qt_app
Další možností, kterou preferuji, je vytvořit soubor qt.conf ve stejném adresáři jako váš spustitelný soubor. Jeho obsah by byl:
[Paths]
Plugins=/path/to/plugins
Více informací o tomto lze nalézt zde a na použití qt.conf
Pokusil jsem se spustit svůj binární soubor zkompilovaný s Qt 5.7
, na Ubuntu 16.04 LTS, kde Qt 5.5
je předinstalovaný. Nefungovalo to.
Nejprve jsem zkontroloval samotnou binárku pomocí ldd
jak zde bylo navrženo, a "uspokojil" všechny "nenalezeno" závislosti. Pak tento notoricky známý This application failed to start because it could not find or load the Qt platform plugin "xcb"
byla vyvolána chyba.
Jak to vyřešit v Linuxu
Nejprve byste měli vytvořit platforms
adresář, kde je váš binární soubor, protože je to místo, kde Qt hledá knihovnu XCB. Zkopírujte libqxcb.so
tam. Zajímalo by mě, proč to autoři jiných odpovědí nezmínili.
Pak možná budete chtít spustit binární soubor s QT_DEBUG_PLUGINS=1
nastavená proměnná prostředí pro kontrolu závislostí libqxcb.so
nejsou "spokojeni". (Můžete také použít ldd
za tímto účelem, jak je navrženo v přijaté odpovědi).
Výstup příkazu může vypadat takto:
[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)
Všimněte si nefunkčního libQt5DBus.so.5
knihovna. Zkopírujte jej do cesty ke svým knihovnám, v mém případě to byl stejný adresář, kde je můj binární soubor (proto LD_LIBRARY_PATH=.
). Tento postup opakujte, dokud nebudou splněny všechny závislosti.
P.S. děkuji autorovi této odpovědi za QT_DEBUG_PLUGINS=1
.