【问题标题】:Deploy PyQt5 application on different Linux machine在不同的 Linux 机器上部署 PyQt5 应用程序
【发布时间】:2016-03-20 10:16:54
【问题描述】:

我一个星期以来一直在努力解决这个问题,所以我想是时候寻求帮助了。长话短说:我正在使用 Python 3.4 和 PyQt5 构建一个应用程序,并且我正在使用 cx_Freeze 创建我的应用程序的独立可执行文件。在 Windows 和 Mac OS 上一切正常时,我在未安装 Qt5 的 Ubuntu 操作系统上执行冻结的应用程序时遇到了这个问题:

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.

应用程序在我用来构建冻结包(安装 Qt5 的地方)的机器上运行良好。

我用谷歌搜索了一下,似乎这个问题很常见。我尝试了以下链接中可以找到的所有内容:

在冻结的应用程序中,我确实有包含libqxcb.so 的平台目录。只是为了保持一致性,我发布了ldd libqxcb.so 的输出,这在安装了 Qt5 的两台机器上都是相同的,而我用于测试的另一台机器上只有一个全新的 Ubuntu 14.04 安装(没有 Qt5) :

linux-vdso.so.1 =>  (0x00007fff563a3000)
libQt5XcbQpa.so.5 => not found
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007feddfeee000)
libX11-xcb.so.1 => /usr/lib/x86_64-linux-gnu/libX11-xcb.so.1 (0x00007feddfcec000)
libXi.so.6 => /usr/lib/x86_64-linux-gnu/libXi.so.6 (0x00007feddfadc000)
libSM.so.6 => /usr/lib/x86_64-linux-gnu/libSM.so.6 (0x00007feddf8d4000)
libICE.so.6 => /usr/lib/x86_64-linux-gnu/libICE.so.6 (0x00007feddf6b8000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007feddf499000)
libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007feddf25d000)
libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007feddefba000)
libQt5DBus.so.5 => /usr/lib/x86_64-linux-gnu/libQt5DBus.so.5 (0x00007fedded3b000)
libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007feddeb39000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fedde931000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007fedde629000)
libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007fedde41f000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fedde20d000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007feddded8000)
libQt5Gui.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 (0x00007feddd88b000)
libQt5Core.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007feddd1e5000)
libGL.so.1 => /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 (0x00007feddcf53000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007feddcd35000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007feddca31000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007feddc72b000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007feddc515000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007feddc150000)
/lib64/ld-linux-x86-64.so.2 (0x00007fede02f4000)
libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007feddbf4b000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007feddbd47000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007feddbb41000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007feddb917000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007feddb6fe000)
libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007feddb4d8000)
libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007feddb293000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007feddb055000)
libharfbuzz.so.0 => /usr/lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007feddae00000)
libicui18n.so.52 => /usr/lib/x86_64-linux-gnu/libicui18n.so.52 (0x00007fedda9f9000)
libicuuc.so.52 => /usr/lib/x86_64-linux-gnu/libicuuc.so.52 (0x00007fedda680000)
libglapi.so.0 => /usr/lib/x86_64-linux-gnu/libglapi.so.0 (0x00007fedda456000)
libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007fedda253000)
libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007fedda04d000)
libxcb-glx.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-glx.so.0 (0x00007fedd9e36000)
libxcb-dri2.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-dri2.so.0 (0x00007fedd9c31000)
libxcb-dri3.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-dri3.so.0 (0x00007fedd9a2e000)
libxcb-present.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-present.so.0 (0x00007fedd982b000)
libxcb-sync.so.1 => /usr/lib/x86_64-linux-gnu/libxcb-sync.so.1 (0x00007fedd9625000)
libxshmfence.so.1 => /usr/lib/x86_64-linux-gnu/libxshmfence.so.1 (0x00007fedd9423000)
libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007fedd921d000)
libdrm.so.2 => /usr/lib/x86_64-linux-gnu/libdrm.so.2 (0x00007fedd9011000)
libgraphite2.so.3 => /usr/lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007fedd8df5000)
libicudata.so.52 => /usr/lib/x86_64-linux-gnu/libicudata.so.52 (0x00007fedd7588000)

这同样适用于ldd Eddy(其中 Eddy 是应用程序的可执行名称):

linux-vdso.so.1 =>  (0x00007fffc812e000)
libpython3.4m.so.1.0 => /home/daniele/Desktop/eddy/build/Eddy-0.4-gpl-linux64/./libpython3.4m.so.1.0 (0x00007fab72345000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fab72127000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fab71d62000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007fab71b38000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fab7191f000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fab7171b000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fab71518000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fab71212000)
/lib64/ld-linux-x86-64.so.2 (0x00007fab7297a000)

在我创建冻结应用程序的机器上,我尝试了从源代码编译的 Qt5 和使用离线安装程序安装的 Qt5。我使用了从源代码编译的 SIP 4.17PyQt5 5.5.1 以及 cx_Freeze 3.4.3

有什么建议吗?

EDIT1:我已经尝试将 libQt5XcbQpa.so.5(连同 libQt5QCore.so.5 等)移动到我的构建目录中,但没有帮助。

【问题讨论】:

  • 尝试找到libQt5XcbQpa.so.5(它说没有找到)并将其复制到构建目录中。
  • 是我尝试的第一件事(忘了提及),但没有帮助。我的开发机器上也缺少它,但应用程序统计信息很好,所以我想问题出在其他地方:(
  • 大多数情况下,某些模块似乎需要 32 位版本。

标签: python ubuntu pyqt cx-freeze pyqt5


【解决方案1】:

将库文件复制到构建目录对于 Linux 目标来说是不够的。确保该目录位于您的 $LD_LIBRARY_PATH 中。

这些来自 QT 部署 documentation 的说明可能会有所帮助:

除非另有说明,否则动态链接器不会搜索目录 您的应用程序所在的位置。有很多方法可以解决这个问题:

  • 您可以将 Qt 库安装在系统库路径之一中 (例如,大多数系统上的 /usr/lib)。
  • 在链接应用程序时,您可以将预定路径传递给 -rpath 命令行选项。这将告诉动态链接器在启动应用程序时查看此 > 目录。
  • 您可以为您的应用程序编写启动脚本, 您在哪里修改动态链接器配置(例如,添加您的 应用程序的目录到 LD_LIBRARY_PATH 环境变量。

注意:如果您的应用程序将使用“设置用户 ID 执行”,如果它由 root 拥有,则 LD_LIBRARY_PATH 将 在某些平台上被忽略。在这种情况下,不能使用 LD_LIBRARY_PATH 方法)。

【讨论】:

  • 谢谢。即使我在阅读您的答案之前就知道了,但您是对的。不过,我会为你的努力提供赏金:)。
猜你喜欢
  • 2016-02-08
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 2018-08-18
  • 2015-11-28
相关资源
最近更新 更多