B站ros2教程3.4.4运行时出现问题
-
《ROS 2机器人开发从入门到实践》书籍配套视频,对应章节3.4.4在功能包中使用QT。社区地址:fishros.org.cn
运行时报以下错误:
wd@ubuntu22:~/cpp_proj/241224/topic_practice_workspace$ ros2 run stat us_display hello_qt /home/wd/cpp_proj/241224/topic_practice_workspace/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
hello.qt.cpp
#include <QApplication> #include <QLabel> #include <QString> int main(int argc, char **argv) { QApplication app(argc, argv); QLabel *label = new QLabel(); QString msg = QString::fromStdString("Hello Qt!\nFROM ROS2"); label->setText(msg); 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()
package.xml
<?xml version="1.0"?> <?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?> <package format="3"> <name>status_display</name> <version>0.0.0</version> <description>TODO: Package description</description> <maintainer email="wd@todo.todo">wd</maintainer> <license>Apache-2.0</license> <buildtool_depend>ament_cmake</buildtool_depend> <depend>rclcpp</depend> <depend>status_interfaces</depend> <test_depend>ament_lint_auto</test_depend> <test_depend>ament_lint_common</test_depend> <export> <build_type>ament_cmake</build_type> </export> </package>
-
您遇到的错误提示表明在运行时链接到了错误的
libpthread.so.0
库,这通常是由于环境变量设置不当或系统库配置问题导致的。错误消息中提到的__libc_pthread_init, version GLIBC_PRIVATE
未定义,通常与系统的 glibc 库版本或链接到的 pthread 库版本不匹配有关。以下是一些可能的解决步骤:
-
检查系统库:
- 确保您的系统上的 glibc 库是最新的,或者至少是与 ROS 2 兼容的版本。
- 使用
ldd --version
和ldconfig -p | grep libpthread
来检查已安装的 pthread 库版本。
-
检查环境变量:
- 确保
LD_LIBRARY_PATH
环境变量没有包含指向错误库版本的路径。您可以通过运行echo $LD_LIBRARY_PATH
来查看当前的设置。 - 如果
LD_LIBRARY_PATH
包含了不应该的路径,尝试移除或更正这些路径。
- 确保
-
重新构建项目:
- 清理并重新构建您的 ROS 2 工作空间。使用以下命令:
cd ~/cpp_proj/241224/topic_practice_workspace colcon build --packages-up-to status_display --clean
- 清理并重新构建您的 ROS 2 工作空间。使用以下命令:
-
检查 Qt5 的安装:
- 确保 Qt5 是通过官方渠道安装,并且版本与您的 ROS 2 版本兼容。
- 如果您是使用 snap 安装了 Qt 或其他相关软件,可能会遇到库版本冲突的问题。考虑使用系统的包管理器(如 apt)来安装 Qt。
-
使用 strace 跟踪库加载:
- 使用
strace
工具来跟踪运行时库加载的情况,这可以帮助识别是哪一个库被错误地加载。运行:strace -e trace=openat ros2 run status_display hello_qt
- 查看输出中是否有任何异常的库加载行为。
- 使用
-
检查 snap 包:
- 由于错误中提到了
/snap/core20/current/lib/x86_64-linux-gnu/libpthread.so.0
,这可能是因为系统中安装了 snap 包,并且这些包与系统的原生库产生了冲突。考虑移除或更新这些 snap 包。
- 由于错误中提到了
如果上述步骤仍然无法解决问题,您可能需要更详细地检查系统的库配置,或者考虑在不同的系统或虚拟机环境中重新设置 ROS 2 和您的项目。希望这些步骤能帮助您解决问题!
以上为生成回答,仅供参考~
-
-
- 是在VSCODE中运行的吗
- VSCODE是怎么安装的
- 在系统终端下运行是否正常
-
@小鱼
1.是在vscode运行的;
2.vscode在ubuntu的应用商店安装的;
3.我试了下,在linux终端下是可以正常运行的。鱼总,这个是为啥呀
-
@admin_ 因为应用上电安装的vscode应该是在snap沙箱中运行的,读取不到系统的某些库
建议直接用一键安装/从VSCODE官方直接下载安装即可
参考:
https://fishros.org.cn/forum/topic/3379/第三章编译小鱼提供的hello_qt源码后-运行时报错/5
https://fishros.org.cn/forum/topic/3326/4-3节-c-服务通信
https://fishros.org.cn/forum/topic/3220/3-4-4-5在功能抱中使用qt报错 -
@小鱼 收到,大佬!