Ubuntu20.04下Qt Creator中Naoqi AL组件未定义引用问题求助
问题分析
undefined reference错误说明编译阶段能找到ALCOMMON头文件(因此Qt Creator有代码补全),但链接阶段无法定位到库中的函数实现,核心原因集中在三点:
- ABI兼容性不匹配:Ubuntu 20.04默认启用C++11 ABI(
_GLIBCXX_USE_CXX11_ABI=1),而旧版NAOqi的ALCOMMON库通常基于旧ABI(_GLIBCXX_USE_CXX11_ABI=0)编译,且你的CMakeFlags设置存在语法错误,导致兼容参数未生效。 - CMake配置顺序混乱:qibuild命令与原生CMake命令混用,干扰了依赖链接的优先级。
- 手动添加的路径覆盖了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
相关产品推荐
相关产品推荐

