3.4.4.5在功能抱中使用QT报错。
-
系统不是虚拟机,主机ubnutu22.04,按照教程抄写代码报出一下错误:
wan@wan-ThinkPad-X1-Yoga-3rd:~/chapt3/topic_practice_ws$ source install/setup.bash
wan@wan-ThinkPad-X1-Yoga-3rd:~/chapt3/topic_practice_ws$ ros2 run status_display hello_qt
qt.qpa.plugin: Could not find the Qt platform plugin "wayland" in ""
/home/wan/chapt3/topic_practice_ws/install/status_display/lib/status_display/hello_qt: symbol lookup error: /snap/core20/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined symbol: __libc_pthread_init, version GLIBC_PRIVATE教材上没有遇到的报错
[ros2run]: Process exited with failure 127hello_qt.cpp代码如下:
#include<QApplication> #include<QLabel> #include<QString> int main(int argc, char* argv[]){ QApplication app(argc, argv); QLabel* label = new QLabel(); QString message = QString::fromStdString("hello Qt!"); label->setText(message); label->show(); app.exec(); return 0; }
CMakeLists.txt代码如下:
cmake_minimum_required(VERSION 3.8) project(status_display) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif() # find dependencies find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(status_interfaces REQUIRED) find_package(Qt5 REQUIRED COMPONENTS Widgets) add_executable(hello_qt src/hello_qt.cpp) target_link_libraries(hello_qt Qt5::Widgets) if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) # the following line skips the linter which checks for copyrights # comment the line when a copyright and license is added to all source files set(ament_cmake_copyright_FOUND TRUE) # the following line skips cpplint (only works in a git repo) # comment the line when this package is in a git repo and when # a copyright and license is added to all source files set(ament_cmake_cpplint_FOUND TRUE) ament_lint_auto_find_test_dependencies() endif() install(TARGETS hello_qt DESTINATION lib/${PROJECT_NAME}) ament_package()
c_cpp_properties.json代码如下:
{ "configurations": [ { "name": "Linux", "includePath": [ "${workspaceFolder}/**", "/opt/ros/humble/include/**" ], "defines": [], "compilerPath": "/usr/bin/gcc", "cStandard": "c17", "cppStandard": "gnu++17", "intelliSenseMode": "linux-gcc-x64" } ], "version": 4 } // /usr/include/x86_64-linux-gnu/qt5/QtCore
-
从你提供的错误信息和代码来看,这里有几个可能的问题和解决方案:
-
Qt 平台插件错误:
qt.qpa.plugin: Could not find the Qt platform plugin "wayland" in ""
这个错误表明 Qt 运行时无法找到名为 "wayland" 的平台插件。这通常是因为 Qt 的配置或安装问题。Ubuntu 22.04 默认使用 Wayland 显示服务器,而 Qt 应用程序需要找到相应的插件来与 Wayland 通信。
解决方案:
- 确保 Qt 安装完整,特别是包含所有必要的插件。
- 你可以尝试设置环境变量
QT_QPA_PLATFORM_PLUGIN_PATH
指向包含wayland
插件的目录。例如,如果 Qt 安装在/opt/Qt
,你可以尝试:export QT_QPA_PLATFORM_PLUGIN_PATH=/opt/Qt/plugins/platforms
- 另外,确保你的 Qt 版本与你的 Ubuntu 版本兼容。
-
符号查找错误:
symbol lookup error: /snap/core20/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined symbol: __libc_pthread_init, version GLIBC_PRIVATE
这个错误表明你的应用程序在尝试使用
libpthread.so.0
时遇到了问题,特别是与 GLIBC 的私有版本相关的符号。这通常与库版本冲突或错误的库链接有关。解决方案:
- 检查你的系统中是否有多个版本的
libpthread
或其他相关库,并确保 ROS2 和 Qt 链接到正确的版本。 - 尝试更新你的系统和所有相关的库到最新版本。
- 如果你使用的是 Snap 安装的 ROS2 或其他软件,可能会遇到与原生系统库不兼容的问题。考虑使用非 Snap 版本或从源代码编译。
- 检查你的系统中是否有多个版本的
-
CMakeLists.txt 和构建配置:
- 确保你的
CMakeLists.txt
正确设置了 Qt5 的路径和组件。 - 检查你的构建环境是否正确设置了所有必要的路径和变量。
- 确保你的
-
其他注意事项:
- 确保你的 ROS2 环境正确设置,并且所有依赖都已正确安装。
- 检查你的
hello_qt.cpp
代码是否有语法错误(虽然你提供的代码看起来语法上是正确的,但注意你使用了 HTML 实体<
和>
而不是<
和>
)。
最后,如果问题仍然存在,尝试在一个新的、干净的 Ubuntu 22.04 环境中重新安装 ROS2 和 Qt,以排除任何特定于系统或配置的问题。
以上为生成回答,仅供参考~
-
-
@261962418 在命令前加上 QT_QPA_PLATFORM=xcb
-
@ganyuanzhen 在哪一条命令上加阿
-
@261962418 ros2 run status_display hello_qt 前面,
QT_QPA_PLATFORM=xcb ros2 run status_display hello_qt
-
@ganyuanzhen 还是一样
wan@wan-ThinkPad-X1-Yoga-3rd:~/chapt3/topic_practice_ws$ QT_QPA_PLATFORM=xcb ros2 run status_display hello_qt
/home/wan/chapt3/topic_practice_ws/install/status_display/lib/status_display/hello_qt: symbol lookup error: /snap/core20/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined symbol: __libc_pthread_init, version GLIBC_PRIVATE
[ros2run]: Process exited with failure 127 -
@261962418 在 3.4.4.5在功能抱中使用QT报错。 中说:
/snap/core20/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined symbol: __libc_pthread_init, version GLIBC_PRIVATE
看起来你的系统环境设置有些问题,按理说不应该识别到snap里面的运行库。看看是不是 ld.so.conf 或者LD_LIBRARY_PATH有问题。
或者可以卸载掉snap,不过这个会导致firefox也一并卸载掉。
-
-
@ganyuanzhen
wan@wan-ThinkPad-X1-Yoga-3rd:~/chapt3/topic_practice_ws$ unset GTK_PATH
unset GIO_MODULE_DIR
wan@wan-ThinkPad-X1-Yoga-3rd:~/chapt3/topic_practice_ws$ QT_QPA_PLATFORM=xcb ros2 run status_display hello_qt
Gtk-Message: 23:45:22.302: Failed to load module "canberra-gtk-module"
Gtk-Message: 23:45:22.302: Failed to load module "canberra-gtk-module" -
@261962418 在 3.4.4.5在功能抱中使用QT报错。 中说:
@ganyuanzhen
wan@wan-ThinkPad-X1-Yoga-3rd:~/chapt3/topic_practice_ws$ unset GTK_PATH
unset GIO_MODULE_DIR
wan@wan-ThinkPad-X1-Yoga-3rd:~/chapt3/topic_practice_ws$ QT_QPA_PLATFORM=xcb ros2 run status_display hello_qt
Gtk-Message: 23:45:22.302: Failed to load module "canberra-gtk-module"
Gtk-Message: 23:45:22.302: Failed to load module "canberra-gtk-module"是不是在snap安装的vscode里面执行的命令。
单独用系统的终端执行试一下呢,
-
@ganyuanzhen 系统中端是这样的
wan@wan-ThinkPad-X1-Yoga-3rd:~/chapt3/topic_practice_ws$ unset GTK_PATH
unset GIO_MODULE_DIR
wan@wan-ThinkPad-X1-Yoga-3rd:~/chapt3/topic_practice_ws$ QT_QPA_PLATFORM=xcb ros2 run status_display hello_qt
Package 'status_display' not found -
@261962418 在 3.4.4.5在功能抱中使用QT报错。 中说:
@ganyuanzhen 系统中端是这样的
wan@wan-ThinkPad-X1-Yoga-3rd:~/chapt3/topic_practice_ws$ unset GTK_PATH
unset GIO_MODULE_DIR
wan@wan-ThinkPad-X1-Yoga-3rd:~/chapt3/topic_practice_ws$ QT_QPA_PLATFORM=xcb ros2 run status_display hello_qt
Package 'status_display' not found一样source一下你工作空间下的setup文件,然后执行 QT_QPA_PLATFORM=xcb ros2 run status_display hello_qt
原理上不会有问题,snap安装的软件,里面的环境配置比较特殊,所以会出一些问题
-
@ganyuanzhen 系统中端是这样的
wan@wan-ThinkPad-X1-Yoga-3rd:~/chapt3/topic_practice_ws$ source install/setup.bash
wan@wan-ThinkPad-X1-Yoga-3rd:~/chapt3/topic_practice_ws$ QT_QPA_PLATFORM=xcb ros2 run status_display hello_qt
Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland to run on Wayland anyway.vscode是这样的
wan@wan-ThinkPad-X1-Yoga-3rd:~/chapt3/topic_practice_ws$ source install/setup.bash
wan@wan-ThinkPad-X1-Yoga-3rd:~/chapt3/topic_practice_ws$ QT_QPA_PLATFORM=xcb ros2 run status_display hello_qt
Gtk-Message: 23:55:43.056: Failed to load module "canberra-gtk-module"
Gtk-Message: 23:55:43.057: Failed to load module "canberra-gtk-module"
^C[ros2run]: Interrupt -
@261962418 Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland to run on Wayland anyway.
这个问题,可以试着换一下GNOME Xorg会话。并不影响程序的运行和显示
-
网上也有这个办法
# 解决方法 rambo@test:~$ sudo nano /etc/gdm3/custom.conf WaylandEnable=false # 取消注释,即在当前图形化中不开启WaylandEn ablerambo@test:~$ sudo systemctl restart gdm3 # 重启服务
我用的是KDE桌面,不是GNOME,所以没遇到过这个报错~
-
@ganyuanzhen 好的,感谢大老的指教和方向,我寨SS,已经卡在这一天了
-