# fastdds_monitor fast dds monitor是基于QT开发的监测fast dds参与者的UI程序。这里列举一些QT相关的调试经验。 首先QT_PLUGIN_PATH变量是任何时候都需要设置的,通常是指向QT安装目录下的plugins文件夹。 假如使用QML开发,那么还需要设置QML2_IMPORT_PATH变量,指向QT安装目录下的qml文件夹。 一般来说,如果打包了相关的QT库之后,设置好这两个变量,应该就可以运行QT程序。 一个运行示例 ```bash #!/bin/bash #######################用于环境变量设置 install_env_name="FASTDDSMONITOR" cur_bash_file_dir=$(dirname "$(realpath "${BASH_SOURCE[0]}")") eval export ${install_env_name}_INSTALL_DIR="$cur_bash_file_dir" eval export CMAKE_PREFIX_PATH="\${${install_env_name}_INSTALL_DIR}:\$CMAKE_PREFIX_PATH" eval export LD_LIBRARY_PATH="\${${install_env_name}_INSTALL_DIR}/lib:\$LD_LIBRARY_PATH" eval export PATH="\${${install_env_name}_INSTALL_DIR}/bin:\$PATH" eval export QT_PLUGIN_PATH="\${${install_env_name}_INSTALL_DIR}/lib/plugins" ## 如果自己安装了qml,则需要让QML2_IMPORT_PATH为空 eval export QML2_IMPORT_PATH="\${${install_env_name}_INSTALL_DIR}/lib/qml" ``` # 报错以及解决方法 ```bash fastdds_monitor Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland to run on Wayland anyway. qt.qpa.plugin: Could not find the Qt platform plugin "xcb" in "" This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. 已中止 (核心已转储) ``` 解决方法:没有设置QT_PLUGIN_PATH,设置正确的QT_PLUGIN_PATH就行。 ```bash fastdds_monitor Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland to run on Wayland anyway. QQmlApplicationEngine failed to load component qrc:/qml/main.qml:23:1: module "QtQuick.Dialogs" is not installed qrc:/qml/main.qml:22:1: module "QtGraphicalEffects" is not installed qrc:/qml/main.qml:21:1: module "QtQuick.Controls" is not installed qrc:/qml/main.qml:20:1: module "QtQuick.Window" is not installed qrc:/qml/main.qml:19:1: module "QtQuick.Layouts" is not installed qrc:/qml/main.qml:23:1: module "QtQuick.Dialogs" is not installed qrc:/qml/main.qml:22:1: module "QtGraphicalEffects" is not installed qrc:/qml/main.qml:21:1: module "QtQuick.Controls" is not installed qrc:/qml/main.qml:20:1: module "QtQuick.Window" is not installed qrc:/qml/main.qml:19:1: module "QtQuick.Layouts" is not installed qrc:/qml/main.qml:23:1: module "QtQuick.Dialogs" is not installed qrc:/qml/main.qml:22:1: module "QtGraphicalEffects" is not installed qrc:/qml/main.qml:21:1: module "QtQuick.Controls" is not installed qrc:/qml/main.qml:20:1: module "QtQuick.Window" is not installed qrc:/qml/main.qml:19:1: module "QtQuick.Layouts" is not installed qrc:/qml/main.qml:23:1: module "QtQuick.Dialogs" is not installed qrc:/qml/main.qml:22:1: module "QtGraphicalEffects" is not installed qrc:/qml/main.qml:21:1: module "QtQuick.Controls" is not installed qrc:/qml/main.qml:20:1: module "QtQuick.Window" is not installed qrc:/qml/main.qml:19:1: module "QtQuick.Layouts" is not installed qrc:/qml/main.qml:23:1: module "QtQuick.Dialogs" is not installed qrc:/qml/main.qml:22:1: module "QtGraphicalEffects" is not installed qrc:/qml/main.qml:21:1: module "QtQuick.Controls" is not installed qrc:/qml/main.qml:20:1: module "QtQuick.Window" is not installed qrc:/qml/main.qml:19:1: module "QtQuick.Layouts" is not installed Error: Your root item has to be a Window. ``` 解决方法:报错在提示各种QtQuick的组件没有安装,我们需要设置正确的QML2_IMPORT_PATH,帮助找到这些组件。 ```bash fastdds_monitor QQmlApplicationEngine failed to load component qrc:/qml/main.qml:52:14: Type MonitorMenuBar unavailable qrc:/qml/MonitorMenuBar.qml:29:5: Type AdaptiveMenu unavailable qrc:/qml/AdaptiveMenu.qml:4:1: Type Menu unavailable file:///usr/lib/x86_64-linux-gnu/qt5/qml/QtQuick/Controls.2/Universal/Menu.qml:65:9: Type ScrollIndicator unavailable file:///usr/lib/x86_64-linux-gnu/qt5/qml/QtQuick/Controls.2/Universal/qmldir: plugin cannot be loaded for module "QtQuick.Controls.Universal": Cannot install element 'Universal' into protected module 'QtQuick.Controls.Universal' version '2' Error: Your root item has to be a Window. ``` 解决方法:这个qml路径是系统安装Qt之后的路径,因为我们设置了QML2_IMPORT_PATH干扰了原本安装的qml,只需要让QML2_IMPORT_PATH为空即可。 ```bash 使用 docker run --privileged -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --shm-size 1000mb -v ~/code/dds_wrapper:/home/humanoid -w /home/humanoid --rm -it amd64/ros:jazzy bash -c "source /home/humanoid/DdsWrapper/x64/setup.bash && exec bash" 进入docker 中,运行monitor: Authorization required, but no authorization protocol specified qt.qpa.xcb: could not connect to display :1 Authorization required, but no authorization protocol specified ``` 解决方法:需要增加主机的连接权限: ```bash xhost + ``` 至于QML2_IMPORT_PATH和/usr/lib/x86_64-linux-gnu/qt5/qt.conf中的Qml2Imports相排斥的问题还有待解决。 最后附上打包的脚本: ```bash #!/bin/bash Qtlib=( /usr/lib/x86_64-linux-gnu/qt5/qml /usr/lib/x86_64-linux-gnu/qt5/plugins/ /usr/lib/x86_64-linux-gnu/libQt5* /usr/lib/x86_64-linux-gnu/libGL.so.1 /usr/lib/x86_64-linux-gnu/libGL.so.1.7.0 /usr/lib/x86_64-linux-gnu/libGLdispatch.so.0 /usr/lib/x86_64-linux-gnu/libGLdispatch.so.0.0.0 /usr/lib/x86_64-linux-gnu/libGLX.so.0 /usr/lib/x86_64-linux-gnu/libGLX.so.0.0.0 /usr/lib/x86_64-linux-gnu/libmd4c.so.0 /usr/lib/x86_64-linux-gnu/libmd4c.so.0.4.8 /usr/lib/x86_64-linux-gnu/libdouble-conversion.so.3 /usr/lib/x86_64-linux-gnu/libdouble-conversion.so.3.1 /usr/lib/x86_64-linux-gnu/libicui18n.so.70 /usr/lib/x86_64-linux-gnu/libicui18n.so.70.1 /usr/lib/x86_64-linux-gnu/libicuuc.so.70 /usr/lib/x86_64-linux-gnu/libicuuc.so.70.1 /usr/lib/x86_64-linux-gnu/libpcre2-16.so.0 /usr/lib/x86_64-linux-gnu/libpcre2-16.so.0.10.4 /usr/lib/x86_64-linux-gnu/libicudata.so.70 /usr/lib/x86_64-linux-gnu/libicudata.so.70.1 /usr/lib/x86_64-linux-gnu/libX11-xcb.so.1 /usr/lib/x86_64-linux-gnu/libX11-xcb.so.1.0.0 /usr/lib/x86_64-linux-gnu/libxcb-icccm.so.4 /usr/lib/x86_64-linux-gnu/libxcb-icccm.so.4.0.0 /usr/lib/x86_64-linux-gnu/libxcb-image.so.0 /usr/lib/x86_64-linux-gnu/libxcb-image.so.0.0.0 /usr/lib/x86_64-linux-gnu/libxcb-keysyms.so.1 /usr/lib/x86_64-linux-gnu/libxcb-keysyms.so.1.0.0 /usr/lib/x86_64-linux-gnu/libxcb-randr.so.0 /usr/lib/x86_64-linux-gnu/libxcb-randr.so.0.1.0 /usr/lib/x86_64-linux-gnu/libxcb-render-util.so.0 /usr/lib/x86_64-linux-gnu/libxcb-render-util.so.0.0.0 /usr/lib/x86_64-linux-gnu/libxcb-shape.so.0 /usr/lib/x86_64-linux-gnu/libxcb-shape.so.0.0.0 /usr/lib/x86_64-linux-gnu/libxcb-sync.so.1 /usr/lib/x86_64-linux-gnu/libxcb-sync.so.1.0.0 /usr/lib/x86_64-linux-gnu/libxcb-xfixes.so.0 /usr/lib/x86_64-linux-gnu/libxcb-xfixes.so.0.0.0 /usr/lib/x86_64-linux-gnu/libxcb-xinerama.so.0 /usr/lib/x86_64-linux-gnu/libxcb-xinerama.so.0.0.0 /usr/lib/x86_64-linux-gnu/libxcb-xkb.so.1 /usr/lib/x86_64-linux-gnu/libxcb-xkb.so.1.0.0 /usr/lib/x86_64-linux-gnu/libxcb-xinput.so.0 /usr/lib/x86_64-linux-gnu/libxcb-xinput.so.0.1.0 /usr/lib/x86_64-linux-gnu/libxkbcommon-x11.so.0 /usr/lib/x86_64-linux-gnu/libxkbcommon-x11.so.0.0.0 /usr/lib/x86_64-linux-gnu/libxkbcommon.so.0 /usr/lib/x86_64-linux-gnu/libxkbcommon.so.0.0.0 /lib/x86_64-linux-gnu/libX11.so.6 /lib/x86_64-linux-gnu/libxcb.so.1 /lib/x86_64-linux-gnu/libXau.so.6 /lib/x86_64-linux-gnu/libXdmcp.so.6 /lib/x86_64-linux-gnu/libbsd.so.0 /lib/x86_64-linux-gnu/libmd.so.0 /usr/lib/x86_64-linux-gnu/libxcb-util.so.1 /usr/lib/x86_64-linux-gnu/libxcb-util.so.1.0.0 ) for lib in "${Qtlib[@]}"; do cp -r $lib /home/diana/code/fast_dds_monitor/Humanoid/x64/fast_dds_monitor/lib/ echo $? done ```