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

Ubuntu20.04下Qt Creator中Naoqi AL组件未定义引用问题求助

问题分析

undefined reference错误说明编译阶段能找到ALCOMMON头文件(因此Qt Creator有代码补全),但链接阶段无法定位到库中的函数实现,核心原因集中在三点:

  1. ABI兼容性不匹配:Ubuntu 20.04默认启用C++11 ABI(_GLIBCXX_USE_CXX11_ABI=1),而旧版NAOqi的ALCOMMON库通常基于旧ABI(_GLIBCXX_USE_CXX11_ABI=0)编译,且你的CMakeFlags设置存在语法错误,导致兼容参数未生效。
  2. CMake配置顺序混乱:qibuild命令与原生CMake命令混用,干扰了依赖链接的优先级。
  3. 手动添加的路径覆盖了qibuild的自动依赖处理逻辑。

修复步骤

1. 修正ABI选项的语法错误

原代码中set(CMAKE_CXX_FLAGS"-D_GLIBCXX_USE_CXX11_ABI=0")缺少空格,会直接覆盖默认编译选项,改为:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_USE_CXX11_ABI=0")

此写法会在原有编译参数基础上追加ABI兼容选项,避免丢失默认配置。

2. 重构CMakeLists.txt,规范qibuild使用

qibuild是NAOqi官方构建工具,可自动处理依赖的头文件和库路径,无需手动添加大量冗余配置。修改后的完整配置如下:

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(nao)

# 初始化qibuild(必须在项目声明后立即执行)
find_package(qibuild REQUIRED)

# 设置ABI兼容参数(必须在创建编译目标前配置)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_USE_CXX11_ABI=0")

# 合并所有源文件(原DCM_SRCS未被纳入编译目标,会导致自定义模块无法参与构建)
SET(ALL_SRCS
    NaoqiDCM.cpp
    NaoqiDCM.h
    sensor.cpp
    sensor.h
    actuator.cpp
    actuator.h
    nao_controller.h
    nao_controller.cpp
    walk.cpp
    walk.h
    util.cpp
    util.h
    parameters.h
)

# 创建可执行文件
qi_create_bin(controller_nao ${ALL_SRCS})

# 链接ALCOMMON库(qibuild自动处理头文件和库路径)
qi_use_lib(controller_nao ALCOMMON)

# 链接Webots库(遵循链接顺序:被依赖库在前,依赖库在后)
set(WEBOTS_HOME "/usr/local/webots")
link_directories(${WEBOTS_HOME}/lib/controller)
include_directories(
    ${WEBOTS_HOME}/include/controller/c
    ${WEBOTS_HOME}/include/controller/cpp
)
target_link_libraries(controller_nao
    ${CMAKE_SHARED_LIBRARY_PREFIX}Controller${CMAKE_SHARED_LIBRARY_SUFFIX}
    ${CMAKE_SHARED_LIBRARY_PREFIX}CppController${CMAKE_SHARED_LIBRARY_SUFFIX}
    m
)

3. 验证ALCOMMON库的可访问性

如果修改后仍报错,手动确认库路径:

  • 检查/usr/lib或NAOqi SDK安装目录下是否存在libalcommon.so
  • 若库不在默认搜索路径,添加qibuild路径配置:
    qi_set_lib_path(ALCOMMON "/path/to/naoqi-sdk/lib")
    

4. 清理缓存重新编译

执行以下命令彻底清除旧缓存,避免残留配置干扰:

rm -rf build/
mkdir build && cd build
cmake ..
make

关键注意事项

  • 链接顺序直接影响依赖解析:你的代码依赖ALCOMMON,Webots库依赖你的代码,因此ALCOMMON要优先链接。
  • 尽量使用qibuild命令管理NAOqi相关依赖,减少手动路径配置,避免冲突。
  • 确保NAOqi SDK版本与Nao 5兼容,Ubuntu 20.04建议使用NAOqi 2.9.x及以上版本。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 02:46:18