ROS2 Humble迁移ROS1 Qt5 GUI遇main未定义错误求助
解决ROS2 Humble中Qt5 GUI编译
undefined reference to main问题(CMAKE_AUTOMOC开启时) 编译错误信息:
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/Scrt1.o: in function `_start': (.text+0x1b): undefined reference to `main' collect2: error: ld returned 1 exit status
仅开启CMAKE_AUTOMOC ON时触发该错误,关闭则出现大量未定义对象问题,结合提供的CMake配置,可通过以下步骤修复:
1. 确认main函数的存在与正确引用
- 检查
src/Example_XYZ_visualization_gui.cpp中是否包含完整的ROS2+Qt入口main函数,示例结构如下:int main(int argc, char *argv[]) { rclcpp::init(argc, argv); QApplication app(argc, argv); Example_XYZ_visualization_gui window; window.show(); int ret = app.exec(); rclcpp::shutdown(); return ret; } - 若main函数位于其他文件,需将该文件添加到
add_executable的源文件列表中。
2. 修正CMake源文件列表与AUTOMOC配置
- 移除头文件与无效变量:头文件无需手动加入
add_executable,AUTOMOC会自动处理带Q_OBJECT宏的头文件;同时移除未定义的${QT_RESOURCES_CPP}和${QT_MOC_HPP}变量,避免编译路径混乱。 - 调整Qt配置顺序:先开启
CMAKE_AUTOMOC等自动处理选项,再执行find_package(Qt5...),确保Qt模块能识别自动生成规则。
3. 修复依赖与链接配置
- 修正ament依赖笔误:
ament_target_dependencies中xyz_interfaces与find_package中的cas_interfaces不匹配,需统一为实际依赖的接口包。 - 使用Qt官方目标链接:替换
${Qt5Core_LIBRARIES}等变量为Qt5::Core、Qt5::Widgets等官方目标,确保链接路径正确。
4. 清理缓存重新编译
删除包的build、install、log目录,执行colcon build --packages-select <你的包名>重新编译,避免旧缓存干扰。
修正后的CMake示例
# find dependencies find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(sensor_msgs REQUIRED) find_package(std_msgs REQUIRED) find_package(cas_interfaces REQUIRED) # 先开启Qt自动处理选项 SET(CMAKE_AUTOMOC ON) SET(CMAKE_AUTOUIC ON) SET(CMAKE_AUTORCC ON) SET(CMAKE_INCLUDE_CURRENT_DIR ON) find_package(Threads REQUIRED) find_package(Qt5Widgets REQUIRED) find_package(Qt5Core REQUIRED) find_package(Qt5PrintSupport REQUIRED) find_package(Qt5Network REQUIRED) add_executable(Example_XYZ_visualization_node src/Example_XYZ_visualization_gui.cpp src/qcustomplot.cpp # 若有.qrc资源文件,直接添加在此处,例如:src/resources.qrc ../Example_XYZ_adv/src/Example_XYZSignal.cpp ../Example_XYZ_adv/src/Example_XYZSignalProcessor.cpp ) ament_target_dependencies(Example_XYZ_visualization_node rclcpp std_msgs sensor_msgs cas_interfaces ) target_link_libraries(Example_XYZ_visualization_node Threads::Threads Qt5::Core Qt5::Network Qt5::Widgets Qt5::PrintSupport ) # 安装可执行文件到ROS2路径 install(TARGETS Example_XYZ_visualization_node DESTINATION lib/${PROJECT_NAME} ) ament_package()
额外检查点
- 确保所有带
Q_OBJECT宏的头文件都在CMake包含路径内,CMAKE_INCLUDE_CURRENT_DIR ON已开启即可覆盖当前目录的include文件夹。 - 若之前手动生成过
moc_*.cpp文件,需删除这些文件,让CMake自动生成,避免冲突。
内容的提问来源于stack exchange,提问作者user24151698
相关产品推荐
相关产品推荐

