Windows编译rplidar_sdk遇make错误,求原因及解决办法
在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++严格类型检查下的窄化转换错误。
修复方案(二选一)
统一枚举类型:
修改src/hal/event.h中Event类的匿名枚举定义,将EVENT_TIMEOUT的类型改为unsigned long:// 原代码 enum { EVENT_TIMEOUT = (unsigned long long)-1 }; // 修改后 enum { EVENT_TIMEOUT = (unsigned long)-1 };强制转换类型:
在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

