【问题标题】:Deploying dynamically linked Qt 5.7 Widgets application on CentOS 7 - cannot open shared library在 CentOS 7 上部署动态链接的 Qt 5.7 Widgets 应用程序 - 无法打开共享库
【发布时间】:2017-10-14 12:01:21
【问题描述】:

我正在尝试在 CentOS 7 上部署动态链接的 Qt 5.7 Widgets 应用程序。即使我没有将 libQt5Widgets.so 复制到构建目录,它也可以在我的机器上正常运行。但是,如果我将应用程序复制到另一台机器上,它会显示:

./Application: error while loading shared libraries: libQt5Widgets.so.5: cannot open shared object file: No such file or directory

当我检查依赖项时:

ldd ./Application

结果是:

linux-vdso.so.1 =>  (0x00007ffdb7126000)
libQt5Widgets.so.5 => /opt/Qt5.7.0/5.7/gcc_64/lib/libQt5Widgets.so.5 (0x00007f2d3f33e000)
libQt5Gui.so.5 => /opt/Qt5.7.0/5.7/gcc_64/lib/libQt5Gui.so.5 (0x00007f2d3eb95000)
libQt5Network.so.5 => /opt/Qt5.7.0/5.7/gcc_64/lib/libQt5Network.so.5 (0x00007f2d3e837000)
libQt5Core.so.5 => /opt/Qt5.7.0/5.7/gcc_64/lib/libQt5Core.so.5 (0x00007f2d3e11c000)
libGL.so.1 => /lib64/libGL.so.1 (0x00007f2d3de97000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2d3dc7b000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f2d3d972000)
libm.so.6 => /lib64/libm.so.6 (0x00007f2d3d66f000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f2d3d459000)
libc.so.6 => /lib64/libc.so.6 (0x00007f2d3d098000)
libz.so.1 => /lib64/libz.so.1 (0x00007f2d3ce81000)
libicui18n.so.56 => /opt/Qt5.7.0/5.7/gcc_64/lib/libicui18n.so.56 (0x00007f2d3c9e7000)
libicuuc.so.56 => /opt/Qt5.7.0/5.7/gcc_64/lib/libicuuc.so.56 (0x00007f2d3c62f000)
libicudata.so.56 => /opt/Qt5.7.0/5.7/gcc_64/lib/libicudata.so.56 (0x00007f2d3ac4b000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f2d3aa47000)
libgthread-2.0.so.0 => /lib64/libgthread-2.0.so.0 (0x00007f2d3a845000)
librt.so.1 => /lib64/librt.so.1 (0x00007f2d3a63c000)
libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f2d3a305000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2d3fb8e000)
libexpat.so.1 => /lib64/libexpat.so.1 (0x00007f2d3a0db000)
libxcb-dri3.so.0 => /lib64/libxcb-dri3.so.0 (0x00007f2d39ed7000)
libxcb-present.so.0 => /lib64/libxcb-present.so.0 (0x00007f2d39cd4000)
libxcb-randr.so.0 => /lib64/libxcb-randr.so.0 (0x00007f2d39ac6000)
libxcb-xfixes.so.0 => /lib64/libxcb-xfixes.so.0 (0x00007f2d398bd000)
libxcb-render.so.0 => /lib64/libxcb-render.so.0 (0x00007f2d396b3000)
libxcb-shape.so.0 => /lib64/libxcb-shape.so.0 (0x00007f2d394af000)
libxcb-sync.so.1 => /lib64/libxcb-sync.so.1 (0x00007f2d392a7000)
libxshmfence.so.1 => /lib64/libxshmfence.so.1 (0x00007f2d390a4000)
libglapi.so.0 => /lib64/libglapi.so.0 (0x00007f2d38e75000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f2d38c4d000)
libXext.so.6 => /lib64/libXext.so.6 (0x00007f2d38a3b000)
libXdamage.so.1 => /lib64/libXdamage.so.1 (0x00007f2d38838000)
libXfixes.so.3 => /lib64/libXfixes.so.3 (0x00007f2d38631000)
libX11-xcb.so.1 => /lib64/libX11-xcb.so.1 (0x00007f2d3842f000)
libX11.so.6 => /lib64/libX11.so.6 (0x00007f2d380f1000)
libxcb-glx.so.0 => /lib64/libxcb-glx.so.0 (0x00007f2d37ed6000)
libxcb-dri2.so.0 => /lib64/libxcb-dri2.so.0 (0x00007f2d37cd1000)
libxcb.so.1 => /lib64/libxcb.so.1 (0x00007f2d37aaf000)
libXxf86vm.so.1 => /lib64/libXxf86vm.so.1 (0x00007f2d378a8000)
libdrm.so.2 => /lib64/libdrm.so.2 (0x00007f2d37699000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f2d37437000)
libXau.so.6 => /lib64/libXau.so.6 (0x00007f2d37233000)

为了解决这个问题,我尝试部署以下库:

Qt5.7.0/5.7/gcc_64/lib/libicui18n.so.56
Qt5.7.0/5.7/gcc_64/lib/libicuuc.so.56 
Qt5.7.0/5.7/gcc_64/lib/libicudata.so.56 
Qt5.7.0/5.7/gcc_64/lib/libQt5Core.so.5.7.0
Qt5.7.0/5.7/gcc_64/lib/libQt5Widgets.so.5.7.0
Qt5.7.0/5.7/gcc_64/lib/libQt5Gui.so.5.7.0
Qt5.7.0/5.7/gcc_64/lib/libQt5Network.so.5.7.0

与应用程序。另外,我创建了符号链接

libQt5Core.so.5
libQt5Widgets.so.5
libQt5Gui.so.5
libQt5Network.so.5

libQt5Widgets.so.5.0.7 和其他 Qt 5.7 库。其余的共享库也存在于另一台机器中。但是还是不行。

它与以下主题有关: Qt project release ubuntu - error while loading shared libraries: libQt5Widgets.so.5QT5.7 How to deploy Qt Application on Linux。 但他们没有解决方案。

  1. 可能是什么问题?
  2. 我该如何解决?

提前致谢。

【问题讨论】:

    标签: c++ qt gcc deployment centos


    【解决方案1】:

    正如这里所说:Qt for Linux/X11 - Deployment (Creating the application package)

    ...但是共享库的主要问题是您必须确保动态链接器能够找到 Qt 库。除非另有说明,否则动态链接器不会搜索应用程序所在的目录。

    有3个解决方案可以解决这个问题:

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

    1. 对于一个简单的应用程序,我不喜欢第一个不污染/usr/bin 目录的选项。

    2. 在 Qt Creator 的 Build & Run 选项卡中,Add build library search path to LD_LIBRARY_PATH 选项默认处于选中状态。 (另外,在Makefile(在构建目录中)的内容中,-rpath 选项是为LFLAGS 指定的。)我不知道为什么,但这个选项对我不起作用。

    3. 我更喜欢第三个选项。在我提供的链接中,有一个可用于此的脚本。

    Application.sh

    #!/bin/sh
    appname=`basename $0 | sed s,\.sh$,,`
    
    dirname=`dirname $0`
    tmp="${dirname#?}"
    
    if [ "${dirname%$tmp}" != "/" ]; then
    dirname=$PWD/$dirname
    fi
    LD_LIBRARY_PATH=$dirname
    export LD_LIBRARY_PATH
    $dirname/$appname "$@"
    

    但文档警告说:

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

    另外,您应该注意,根据文档,您必须在应用程序目录中的platforms/libqxcb.so 中包含The Qt xcb platform plugin。您可以在以下位置找到它:

    Qt5.7.0/5.7/gcc_64/plugins/platforms/libqxcb.so
    

    完成这些操作后,您仍然会遇到问题。它会抱怨:

    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.
    ./Application.sh: line 12:  3783 Aborted (core dumped) $dirname/$appname "$@"
    

    这是因为libqxcb.so还有其他依赖(可以用命令查看:ldd libqxcb.so):

    libQt5XcbQpa.so.5
    libQt5DBus.so.5
    

    要解决它,您必须从以下位置复制共享库:

    Qt5.7.0/5.7/gcc_64/lib/libQt5XcbQpa.so.5.7.0
    Qt5.7.0/5.7/gcc_64/lib/libQt5DBus.so.5.7.0
    

    并创建相应的符号链接:

    libQt5XcbQpa.so.5
    libQt5DBus.so.5
    

    在其他共享库、您的可执行文件和脚本所在的目录中。 重要为共享库创建以名称libQt5 开头的符号链接。否则还是打不开。

    简单来说,你的目录内容如下:

    Application (The executable)
    Application.sh (The script you will execute to run your application)
    libicudata.so.56
    libicui18n.so.56
    libicuuc.so.56
    libQt5Core.so.5 -> libQt5Core.so.5.7.0
    libQt5Core.so.5.7.0
    libQt5DBus.so.5 -> libQt5DBus.so.5.7.0
    libQt5DBus.so.5.7.0
    libQt5Gui.so.5 -> libQt5Gui.so.5.7.0
    libQt5Gui.so.5.7.0
    libQt5Network.so.5 -> libQt5Network.so.5.7.0
    libQt5Network.so.5.7.0
    libQt5Widgets.so.5 -> libQt5Widgets.so.5.7.0
    libQt5Widgets.so.5.7.0
    libQt5XcbQpa.so.5 -> libQt5XcbQpa.so.5.7.0
    libQt5XcbQpa.so.5.7.0
    platforms/libqxcb.so
    

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多