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

Windows编译rplidar_sdk遇make错误,求原因及解决办法

RPLIDAR SDK Windows编译错误与解决方法

在Windows环境下使用make命令编译Slamtec的rplidar_sdk项目时,出现编译错误与若干警告,以下是具体原因及修复方案:


核心编译错误(导致编译失败)

窄化转换错误

src/sl_lidar_driver.cpp:556:34: error: narrowing conversion of 'rp::hal::Event::EVENT_TIMEOUT' from 'long long unsigned int' to 'long unsigned int' [-Wnarrowing]

原因

rp::hal::Event::EVENT_TIMEOUT被定义为unsigned long long类型,但grabScanDataHq函数的switch分支中,用于判断的变量是unsigned long类型,类型不匹配触发了C++严格类型检查下的窄化转换错误。

修复方案(二选一)

  1. 统一枚举类型:
    修改src/hal/event.h中Event类的匿名枚举定义,将EVENT_TIMEOUT的类型改为unsigned long:

    // 原代码
    enum {
        EVENT_TIMEOUT = (unsigned long long)-1
    };
    // 修改后
    enum {
        EVENT_TIMEOUT = (unsigned long)-1
    };
    
  2. 强制转换类型:
    在sl_lidar_driver.cpp第556行,对case中的常量做类型转换:

    // 原代码
    case rp::hal::Event::EVENT_TIMEOUT:
    // 修改后
    case static_cast<unsigned long>(rp::hal::Event::EVENT_TIMEOUT):
    

警告问题修复(消除编译警告)

1. 枚举转换溢出警告(event.h第108行)

src/hal/event.h:108:20: warning: conversion from 'rp::hal::Event::' to 'long unsigned int' changes value from 'rp::hal::Event::EVENT_TIMEOUT' to '4294967295' [-Woverflow]

原因

EVENT_TIMEOUT为unsigned long long类型,转换为unsigned long时高位被截断,值发生变化触发溢出警告。

修复

采用上述核心错误的第一种修复方案,统一EVENT_TIMEOUT的类型为unsigned long即可解决。


2. 有符号/无符号整数比较警告(第1089、1370、1379行)

src/sl_lidar_driver.cpp:1089:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector::size_type' {aka 'long long unsigned int'} [-Wsign-compare]
src/sl_lidar_driver.cpp:1370:40: warning: comparison of integer expressions of different signedness: 'int' and 'unsigned int' [-Wsign-compare]

原因

  • 循环变量pos是有符号的int类型,而cmd_packet.size()是无符号的size_t类型,两者比较触发符号不匹配警告。
  • dist_predict1/2是unsigned int类型,与默认是int类型的十六进制常量比较,符号不匹配。

修复

  • 第1089行:将循环变量类型改为size_t:
    // 原代码
    for (int pos = 0; pos < cmd_packet.size(); pos++) {
    // 修改后
    for (size_t pos = 0; pos < cmd_packet.size(); pos++) {
    }
    
  • 第1370、1379行:给十六进制常量添加U后缀,转为无符号类型:
    // 原代码
    if ((dist_predict1 == 0xFFFFFE00) || (dist_predict1 == 0x1FF)) {
    // 修改后
    if ((dist_predict1 == 0xFFFFFE00U) || (dist_predict1 == 0x1FFU)) {
    }
    

3. 未使用变量/函数警告(第1058、72、59行)

src/sl_lidar_driver.cpp:1058:19: warning: unused variable 'pkt_header' [-Wunused-variable]
src/sl_lidar_driver.cpp:72:17: warning: 'void sl::convert(...)' defined but not used [-Wunused-function]

原因

代码中定义了变量或函数,但未实际使用,触发编译器的未使用检查警告。

修复

  • 第1058行:若该变量无实际用途,直接删除定义;若后续会用到则保留。
  • 第72、59行:删除未使用的静态函数,或在编译配置文件mak_common.inc的编译参数中添加-Wno-unused-function屏蔽该类警告(推荐优先删除无用代码)。

快速临时解决方案(不修改源码)

若不想修改源码,可在mak_common.inc的编译flags中添加以下参数,屏蔽所有相关警告:

CFLAGS += -Wno-narrowing -Wno-overflow -Wno-sign-compare -Wno-unused-variable -Wno-unused-function
CXXFLAGS += -Wno-narrowing -Wno-overflow -Wno-sign-compare -Wno-unused-variable -Wno-unused-function

注意:此方法仅屏蔽警告,未从根本解决类型不匹配问题,建议优先采用源码修改方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 08:09:18