2016-03-20 2 views
0

Я пытаюсь развернуть приложение C++, скомпилированное с gcc в Linux, поместив необходимые .so-файлы в исполняемый каталог. Я добавил флаг linker -Wl,-rpath=$ORIGIN, чтобы программа могла искать связанные библиотеки в каталоге, где она находится. Это работает до тех пор, пока не будут найдены все библиотеки, которые напрямую связаны с моим исполняемым файлом (проверено через ldd).

Однако, когда я пытаюсь запустить приложение, я получаю следующее сообщение об ошибке:

This application failed to start because it could not find or load the Qt platform plugin "xcb". 

Available platform plugins are: linuxfb, minimal, offscreen, xcb. 

Reinstalling the application may fix this problem. 

Платформа плагинов расположены в папке ./platforms (по отношению к исполняемому пути). Те некоторые другие общие файлы объектов, которые, очевидно, загружены Qt, один из которых - libqxcb.so. Теперь проблема в том, что этот файл снова зависит от libQt5Gui.so, libQt5Core.so и т. Д. Они расположены в моем пути к приложению, но я подозреваю, что libqxcb.so как-то не может их найти, поэтому он терпит неудачу. Есть ли возможность, как я могу это исправить?

Если я использую следующий скрипт для запуска приложения, оно работает (примечание: Ct это имя исполняемого файла):

#!/bin/sh 

DIR="$(cd "$(dirname "$0")" && pwd)" 
cd $DIR 
LD_LIBRARY_PATH=LD_LIBRARY_PATH:. ./Ct 

Но я хотел бы достичь этой цели без необходимости использовать скрипт для запустите приложение.

+1

проверить «ldd» ваш «libqxcb.so», он даст вам ответ на ваше подозрение в отношении пропущенных библиотек. – Arseniy

+0

Я уже делал, когда создавал вопрос, и, как сказано, он не может их найти. Вопрос в том, почему он не находит их и как я могу это исправить (кроме запуска приложения с этим скриптом). – user1488118

ответ

1

Документ развертывания qt не особенно полезен.

Ключом к решению этой проблемы является просмотр вывода ldd libqxcb.so, который находится в папке lib.

libQt5Core.so.5 => <*>/plugins/platforms/./../../lib/libQt5Core.so.5 (0x00007f5f8374a000) 

Поэтому структура каталогов должна выглядеть следующим образом:

app 
|-- lib 
| |-- libQt5Core.so.5 
| |-- libQt5Gui.so.5 
| |-- libQt5DBus.so.5 
| |-- libQt5XcbQpa.so.5 
| |-- libicui18n.so.56 
| |-- libicuuc.so.56 
| `-- libicudata.so.56 
|-- qt.conf 
|-- app_exec 
`-- plugins 
    `-- platforms 
     `-- libqxcb.so 

В project.pro установить RPATH приложение для Lib папки:

unix:!mac{ 
    QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN/lib\'" 
} 

Наконец, вам нужно настроить Qt .conf для вашего приложения, чтобы иметь возможность находить плагины (по умолчанию выглядит из папки платформ):

[Paths] 
Prefix=./ 
Libraries=lib 
Plugins=plugins 
+0

Эй, спасибо за ответ. Я попробую, как только у меня будет время. Что мне непонятно, это то, что './Bin' в дереве каталогов. Исполняемый файл по-прежнему входит в папку 'app', верно? – user1488118

+1

Да, извините, это был бы исполняемый файл, qt.conf должен находиться в том же каталоге, что и ваш исполняемый файл http://doc.qt.io/qt-5/qt-conf.html – user1145065

+0

Спасибо, работает как шарм , Существенной частью был файл 'qt.conf' с линией' Libraries = ... '. В результате также файлы общих объектов, которые загружаются как плагин, находят свои зависимости. – user1488118

Смежные вопросы