【问题标题】:How to fix 'Could not load the Qt platform plugin "xcb" in "" even though it was found.' after fixup_bundle macro?如何修复“即使找到了也无法在“”中加载 Qt 平台插件“xcb”。在 fixup_bundle 宏之后?
【发布时间】:2019-12-13 04:18:04
【问题描述】:

我正在尝试建立一个可以在大多数 Linux 发行版(例如 Blender)上运行的独立二进制存档 (.tar.gz)。我仍然不熟悉 CMake。据我所知,所有依赖项都可以在安装步骤使用fixup_bundle 宏解决。而且我假设安装目录应该成为一个独立的应用程序,可以在没有安装Qt的其他计算机上复制和运行?我不确定 CPack 在这里的作用。

我尝试过的

我的Qt安装路径是/home/<user>/Qt5.12.2/5.12.2/gcc_64/qmake。我遵循了一些答案并将platform/libqxcb.solibQt5XcbQpa.so.5 复制到安装目录中。为了测试独立包,我将~/Qt5.12.2 更改为~/qt。这是可执行文件运行时的错误消息:

qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: xcb.

[1]    25965 abort (core dumped)  ./<executable_name>

我也尝试过qt.conf 并将前缀和插件路径设置为./,但这不起作用。我发现一个有趣的事情是,当我设置Plugins = /home/&lt;user&gt;/qt/5.12.2/gcc_64/plugins 时,会显示一个小 Qt 窗口,但会出现一堆错误消息:

qrc:/main.qml:4:1: module "QtQuick.Dialogs" is not installed
qrc:/main.qml:1:1: module "QtQuick" is not installed
qrc:/main.qml:3:1: module "QtQuick.Controls" is not installed
......
qrc:/main.qml:3:1: module "QtQuick.Controls" is not installed
qrc:/main.qml:5:1: module "QtQuick.Controls.Styles" is not installed
qrc:/main.qml:2:1: module "QtQuick.Layouts" is not installed

然后,我通过ldd测试这两个libqxcb.so找到了一些信息,虽然我不确定这是不是真正的原因。

ldd ~/qt/5.12.2/gcc_64/plugins/platforms/libqxcb.so显示原来的libqxcb.so链接了Qt安装自带的库:

        libQt5XcbQpa.so.5 => /home/giokka/qt/5.12.2/gcc_64/plugins/platforms/../../lib/libQt5XcbQpa.so.5 (0x00007ff8936d7000)
        libQt5Gui.so.5 => /home/giokka/qt/5.12.2/gcc_64/plugins/platforms/../../lib/libQt5Gui.so.5 (0x00007ff892d64000)
        libQt5DBus.so.5 => /home/giokka/qt/5.12.2/gcc_64/plugins/platforms/../../lib/libQt5DBus.so.5 (0x00007ff892ad8000)
        libQt5Core.so.5 => /home/giokka/qt/5.12.2/gcc_64/plugins/platforms/../../lib/libQt5Core.so.5 (0x00007ff892343000)
......
        libicui18n.so.56 => /home/giokka/qt/5.12.2/gcc_64/plugins/platforms/../../lib/libicui18n.so.56 (0x00007ff8914ee000)
        libicuuc.so.56 => /home/giokka/qt/5.12.2/gcc_64/plugins/platforms/../../lib/libicuuc.so.56 (0x00007ff891136000)
        libicudata.so.56 => /home/giokka/qt/5.12.2/gcc_64/plugins/platforms/../../lib/libicudata.so.56 (0x00007ff88f751000)
......

ldd &lt;path_to_project&gt;/build/install/platforms/libqxcb.so 显示它链接到系统 Qt 库,这不是我的项目所基于的:

./platforms/libqxcb.so: /lib64/libQt5XcbQpa.so.5: version `Qt_5_PRIVATE_API' not found (required by ./platforms/libqxcb.so)
./platforms/libqxcb.so: /lib64/libQt5Gui.so.5: version `Qt_5_PRIVATE_API' not found (required by ./platforms/libqxcb.so)
        libQt5XcbQpa.so.5 => /lib64/libQt5XcbQpa.so.5 (0x00007f1d8ea75000)
        libQt5Gui.so.5 => /lib64/libQt5Gui.so.5 (0x00007f1d8e41e000)
        libQt5DBus.so.5 => /lib64/libQt5DBus.so.5 (0x00007f1d8e382000)
        libQt5Core.so.5 => /lib64/libQt5Core.so.5 (0x00007f1d8de62000)
......
        libicui18n.so.63 => /lib64/libicui18n.so.63 (0x00007f1d8cf37000)
        libicuuc.so.63 => /lib64/libicuuc.so.63 (0x00007f1d8cd64000)
        libicudata.so.63 => /lib64/libicudata.so.63 (0x00007f1d8afd0000)
......

源代码

CMakeLists.txt

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)

project(OpenGLUnderQML LANGUAGES CXX)

set(CMAKE_PREFIX_PATH "$ENV{HOME}/Qt5.12.2/5.12.2/gcc_64/lib/cmake")
set(qt_lib_path "$ENV{HOME}/Qt5.12.2/5.12.2/gcc_64")

list(APPEND qt_modules
    Core
    Gui
    Quick
    DBus
)

foreach(module ${qt_modules})
    list(APPEND qt_libs "Qt5::${module}")
endforeach()

include(GNUInstallDirs)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}")


find_package(Qt5 COMPONENTS ${qt_modules} REQUIRED)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

include_directories(include/)

list(APPEND headers
    include/Scene.hpp
    include/Renderer.hpp
    include/VertexArray.hpp
    include/VertexBuffer.hpp
    include/VertexLayout.hpp
    include/IndexBuffer.hpp
    include/Shader.hpp
)

list(APPEND qrc
    qml/qml.qrc
    res/fonts.qrc
    res/shaders.qrc
)

add_executable(${PROJECT_NAME}
    src/main.cpp
    src/Scene.cpp
    src/Renderer.cpp
    src/VertexArray.cpp
    src/VertexBuffer.cpp
    src/VertexLayout.cpp
    src/IndexBuffer.cpp
    src/Shader.cpp
    ${headers}
    ${qrc}
)

target_link_libraries(${PROJECT_NAME}
    PUBLIC
        ${qt_libs}
)


file(RELATIVE_PATH _rel "${CMAKE_INSTALL_PREFIX}/install" "${CMAKE_INSTALL_PREFIX}")
set(_rpath "\$ORIGIN/${_rel}")
file(TO_NATIVE_PATH "${_rpath}/install" app_RPATH)

set_target_properties(${PROJECT_NAME}
    PROPERTIES
        SKIP_BUILD_RPATH OFF
        BUILD_WITH_INSTALL_RPATH OFF
        INSTALL_RPATH ${app_RPATH}
        INSTALL_RPATH_USE_LINK_PATH ON
)

install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_BINARY_DIR}/install)
install(
    CODE "
include(BundleUtilities)
fixup_bundle(\"${CMAKE_BINARY_DIR}/install/${PROJECT_NAME}\" \"\" \"\")
"
    DESTINATION ${CMAKE_BINARY_DIR}/install
    COMPONENT Runtime
)

install(FILES "$<TARGET_FILE:Qt5::QXcbIntegrationPlugin>" DESTINATION ${CMAKE_BINARY_DIR}/install/platforms)

qt.conf

[Paths]
Prefix = ./
Plugins = /home/giokka/qt/5.12.2/gcc_64/plugins

更新01:

这是我的qt.conf 文件,但它不起作用。

[Paths]
Prefix = .
Libraries = lib
Qml2Imports = qml
Plugins = plugins

但是,此脚本在我的编译计算机上运行,​​但在另一台计算机上却不行:

export LD_LIBRARY_PATH=`pwd`/lib
export QML_IMPORT_PATH=`pwd`/qml
export QML2_IMPORT_PATH=`pwd`/qml
export QT_QPA_PLATFORM_PLUGIN_PATH=`pwd`/plugins/platforms
./OpenGLUnderQML

我的捆绑包内容:

lib
OpenGLUnderQML (the executable)
plugins
qml
qt.conf
startapp.sh (the script above)

libpluginsqml 完全从 QTDIR 复制而来(大约 500 MB),因此应该没有遗漏任何库或插件。

【问题讨论】:

  • 您的问题解决了吗?
  • 同样的问题,可能是无关的原因:我从pip 安装了一个 OpenCV,它与我使用的 Qt 不兼容。删除 pip 包(opencv-python)并安装系统包(python-opencv,例如,使用pacman)后,应用程序停止崩溃。

标签: c++ qt cmake qml shared-libraries


【解决方案1】:

我遇到了一个非常相似的问题,并带有相同的错误消息。 首先,通过开启调试一些

导出 QT_DEBUG_PLUGINS=1

并重新运行应用程序。对我来说,这揭示了以下内容:

“无法加载库/home/.../miniconda3/lib/python3.7/site-packages/PyQt5/Qt/plugins/platforms/libqxcb.so: (libxkbcommon-x11.so.0: 无法打开共享对象文件: 没有这样的文件或目录)"

“无法加载库/home/.../miniconda3/lib/python3.7/site-packages/PyQt5/Qt/plugins/platforms/libqxcb.so: (libxkbcommon-x11.so.0: 无法打开共享对象文件:没有这样的文件或目录)"

确实,我缺少 libxkbcommon-x11.so.0 和 libxkbcommon-x11.so.0。接下来,使用 dpkg 从 linux 命令行检查您的架构。 (对我来说,命令“arch”给出了不同且无用的结果)

dpkg --print-architecture #result for me: amd64

然后我搜索了“libxkbcommon-x11.so.0 ubuntu 18.04 amd64”,同样搜索了 libxkbcommon-x11.so.0,它会在 packages.ubuntu.com 上生成这些包。这告诉我,回想起来毫不奇怪,我缺少名为 libxkbcommon-x11-0 和 libxkbcommon-0 的软件包,并且安装这些软件包将包含所需的文件,但开发版本不会。那么解决方案:

sudo apt-get 更新

sudo apt-get install libxkbcommon0

sudo apt-get install libxkbcommon-x11-0

【讨论】:

    【解决方案2】:

    我正在开发 Pop!_OS,它是 Ubuntu 21.04 的 Linux 变体,试图在 Pycharm 中构建 QT5 应用程序。我花了 1 天的时间终于为我找到了this solution

    似乎 cv2 (opencv-python) 和 QT5 之间存在冲突导致此错误。我不得不卸载 opencv-python 并安装 opencv-python-headless 来解决这个问题:

    pip uninstall opencv-python
    pip install opencv-python-headless
    

    【讨论】:

    • 但是问题不是关于PyQt,主题启动器使用CMake,为什么您的解决方案会在这种情况下有所帮助?
    • 执行此操作后,有时可以解决问题,但此解决方案适用于我 import cv2 import os for k, v in os.environ.items(): if k.startswith("QT_") and v中的“cv2”:del os.environ[k]
    【解决方案3】:

    您在这里有多个问题,所以我将分别解决。

    1。 CMake 使用了错误的 Qt 安装。

    这里 CMake 的入口点是 find_package 函数。此函数在搜索库时使用启发式方法。这是documentation的片段:

    <prefix>/(lib/<arch>|lib*|share)/cmake/<name>*/                 (U)
    <prefix>/(lib/<arch>|lib*|share)/<name>*/                       (U)
    <prefix>/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/         (U)
    <prefix>/<name>*/(lib/<arch>|lib*|share)/cmake/<name>*/         (W/U)
    <prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/               (W/U)
    <prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/ (W/U)
    

    所以你的前缀路径应该是

    set(CMAKE_PREFIX_PATH "$ENV{HOME}/Qt5.12.2/5.12.2/gcc_64")
    

    大多数 情况下,这应该足够了。 如果这还不够,那么 goto 方法是在执行 CMake 命令之前修改 PATH 变量,如下所示:

    export PATH=~/Qt5.12.2/5.12.2/gcc_64:$PATH
    cmake .. # do your cmake stuff
    

    这里的一个好的做法是让一个名为 QTDIR 的系统范围的环境变量指向 Qt 的正确安装(例如,.bash_profile 中的 export QTDIR=/Qt5.12.2/5.12.2/gcc_64)并改用它。

    2。 CMake 找不到插件。

    来自BundleUtilities 模块的fixup_bundle 命令只是更改动态库加载路径并将必要的内容复制到包中。 构建可分发的 Qt 应用程序不仅仅是更改库 - 请参阅 documentation。 Qt 为 Windows 和 MacOS 提供了专门的工具:windeployqtmacdeployqt。 但是对于 Linux,没有官方工具,但您可以查看非官方的 linuxdeployqt。无论如何,对您来说最重要的指南是"Qt for Linux/X11 - Deployment"fixup_bundle 无法修复插件,因为加载插件的机制不同 - 它们是根据代码动态加载的。

    简单地说,您需要知道您使用了哪些插件以及 Qt 模块需要哪些资源。一旦你弄清楚了 - 将它们复制到你的包中。上面提到的工具正是这样做的(在修复动态库的基础上)。

    【讨论】:

    • 我已将整个插件目录复制到包中并在 qt.conf 中设置“Plugins = ./plugins”,但它仍然显示相同的错误qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.。除了复制插件我应该怎么做?
    • @AlisterKao 首先我会仔细检查doc.qt.io/qt-5/qt-conf.html 文档
    • 你能给我一些提示吗?我已经更新了我的问题。很抱歉我的 cmets 收到了多个通知。
    • @AlisterKao 设置QT_DEBUG_PLUGINS 并检查输出。还要检查这个thread
    【解决方案4】:

    如果仍然相关,我在尝试执行使用自定义 Qt 构建编译的二进制文件时遇到了同样的错误。没有深入研究它,但解决该错误的方法是删除链接器的“rpath”选项并使用“LD_LIBRARY_PATH=/absolute/path/to/custom/Qt/libs/path/to/binary”运行二进制文件。也许这是进一步调查的开始。

    【讨论】:

      【解决方案5】:

      在略有不同的情况下,我收到了相同的错误消息。问题是 Ubuntu 中缺少一个包:libxcb-xinerama0。通过运行修复

      sudo apt install libxcb-xinerama0
      

      【讨论】:

        猜你喜欢
        • 2022-07-25
        • 2021-09-03
        • 2019-10-09
        • 2020-05-05
        • 1970-01-01
        • 2016-01-08
        • 1970-01-01
        • 2019-01-25
        • 1970-01-01
        相关资源
        最近更新 更多