You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:05:16