在 Arduino DUE 上编译 EKfilter C++ 库时遇到问题
Posted
技术标签:
【中文标题】在 Arduino DUE 上编译 EKfilter C++ 库时遇到问题【英文标题】:Trouble Compiling EKfilter C++ Library on Arduino DUE 【发布时间】:2015-04-26 16:53:33 【问题描述】:更新:通过将 operator[] 实际替换为 this->operator[] 来修复最终错误。
更新 2:logic_error 已修复! _P 错误就是剩下的全部了! (只出现在 DUE 中,而不是 UNO 或其他板上...)
更新 3:将临时矩阵的名称更改为 _Pt 有效,可能是保留的宏?
新错误:
Arduino: 1.6.1 (Mac OS X), Board: "Arduino Due (Programming Port)"
/Users/zackbright/Documents/Arduino/libraries/StandardCplusplus-master/func_exception.cpp: In function 'void std::__throw_bad_alloc()':
/Users/zackbright/Documents/Arduino/libraries/StandardCplusplus-master/func_exception.cpp:30:18: error: exception handling disabled, use -fexceptions to enable
throw bad_alloc();
^
Error compiling.
看来我需要使用 -fexceptions...
此报告将包含更多信息 “在编译期间显示详细输出” 在文件 > 首选项中启用。
这里有很多,但我希望尽我所能得到一个好的答案。
在 OSX 上将 Arduino 1.6.1 用于 arduino DUE。
使用这个库来获取 std 命名空间 'https://github.com/maniacbug/StandardCplusplus/'
这是我在编译时遇到问题的库: 'http://kalman.sourceforge.net/index.php'
我已经将过滤器库移动到这种格式,以便能够在 arduino 中使用它,现在至少能够在没有找到头文件的情况下进行包含:
如您所见,我必须将文件重命名为 .h 标头(不确定这有多么必要),并将文件夹重命名为与我的 .cpp 和 .h 相同的标题,当然还要编辑所有随附的文件以不同方式引用文件: 例子
#include "kalman/ekfilter.hpp"
//the "kalman/" is because these used to be in a separate include folder
现在改为:
#include "ekfilter.h"
所以,现在,当我尝试编译时:
#include <StandardCplusplus.h>
#include <ekfilter.h>
void setup()
// put your setup code here, to run once:
void loop()
// put your main code here, to run repeatedly:
我得到了如下所示的这些错误。
第一个错误真的让我抓狂,因为这个 StandardCplusplus 库应该处理 std:: 命名空间,而且我在该代码库中的实现表面上找不到任何错误。
据我所知,_P 之后的大部分内容都是一个问题,即第一个错误会阻止将 _P 变量转换为 kmatrix.h 中定义的矩阵。奇怪的是,这可能指向一个解决方案,当我为 Arduino UNO 编译时,这些错误不会出现。
老实说,我只是不清楚最后一对错误是什么意思。
Arduino: 1.6.1 (Mac OS X), Board: "Arduino Due (Programming Port)"
在 /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector.h:37:0 包含的文件中, 来自/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:33, 来自 TestKalmanLibrary.ino:2:
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ktypes.h:74:48:错误:“”标记之前的预期类名
struct KalmanError : public std::logic_error ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ktypes.h:在构造函数“Kalman::KalmanError::KalmanError(const string&)”中: /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ktypes.h:82:9: 错误:
“Kalman::KalmanError”类没有任何名为“logic_error”的字段
: logic_error(message) ^
在 /Users/insertnamehere/Documents/Arduino/libraries/StandardCplusplus-master/cctype:19:0 包含的文件中, 来自/Users/insertnamehere/Documents/Arduino/libraries/StandardCplusplus-master/istream:21, 来自/Users/insertnamehere/Documents/Arduino/libraries/StandardCplusplus-master/iostream:27, 来自 /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector.h:35, 来自/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:33, 来自 TestKalmanLibrary.ino:2: /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:在全球范围内:
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:807:20:
错误:数字常量之前的预期不合格 ID
mutable Matrix _P; //!< Temporary matrix. ^
在 /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:817:0 中包含的文件中, 来自 TestKalmanLibrary.ino:2: /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:在成员函数'void Kalman::EKFilter::init(Kalman::EKFilter::Vector&, Kalman::EKFilter::Matrix&)'中:
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:196:8: 错误:
请求'16'中的成员'swap',它是非类类型'int'
_P.swap(P_); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:在成员函数'const Matrix& Kalman::EKFilter::calculateP() const'中: /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:435:10: 错误:在“16”中请求成员“resize”,它是非类类型“int”
_P.resize(n, n); // keep this resize ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:439:15:错误:表达式不能用作函数
_P(i,i) = U(i,i); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:443:17:错误:表达式不能用作函数
_P(i,j) = U(i,j)*U(j,j); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:444:17:错误:表达式不能用作函数
_P(i,i) += U(i,j)*_P(i,j); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:444:35:错误:表达式不能用作函数
_P(i,i) += U(i,j)*_P(i,j); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:447:19:错误:表达式不能用作函数
_P(i,j) += U(i,k)*U(j,k)*U(k,k); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:450:17:错误:表达式不能用作函数
_P(j,i) = _P(i,j); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:450:27:错误:表达式不能用作函数
_P(j,i) = _P(i,j); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:在成员函数“virtual void Kalman::EKFilter::sizeUpdate()”中: /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:572:26:错误:表达式不能用作函数
U(i,j) = _P(i,j); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:583:10: 错误:在“16”中请求成员“resize”,它是非类类型“int”
_P.resize(n, nn); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:586:17:错误:表达式不能用作函数
_P(i,j) = U(i,j); ^
在 /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector.h:34:0 包含的文件中, 来自/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:33, 来自 TestKalmanLibrary.ino:2: /Users/insertnamehere/Documents/Arduino/libraries/StandardCplusplus-master/string:在 'std::basic_string::size_type std::basic_string::find_first_not_of(const std::basic_string&, std::basic_string::size_type) 的实例化中const [with Ch = char; Tr = std::char_traits; A = std::分配器; std::basic_string::size_type = unsigned int]': /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector_impl.h:66:42:从这里需要 /Users/insertnamehere/Documents/Arduino/libraries/StandardCplusplus-master/string:518:64:注意:非限定查找未找到依赖基“std::vector >”中的声明
if( Tr::eq(str[j], operator[](i)) ) ^
/Users/insertnamehere/Documents/Arduino/libraries/StandardCplusplus-master/string:518:64:注意:请改用“this->operator[]” 编译出错。
所以这里有很多要修复的地方,但这都是在我修复了库格式化方式的一些问题之后:
我必须将 -fpermissive 添加到“/boards.txt”编译首选项
他们的代码中有一个奇怪的实现无法编译,我改变了这个:
// These are explicitly GNU C++ specific.
// This is the exception class we report -- "GNUCC++\0".
const _Unwind_Exception_Class __gxx_exception_class
= ((((((((_Unwind_Exception_Class) 'G'
<< 8 | (_Unwind_Exception_Class) 'N')
<< 8 | (_Unwind_Exception_Class) 'U')
<< 8 | (_Unwind_Exception_Class) 'C')
<< 8 | (_Unwind_Exception_Class) 'C')
<< 8 | (_Unwind_Exception_Class) '+')
<< 8 | (_Unwind_Exception_Class) '+')
<< 8 | (_Unwind_Exception_Class) '\0');
到这里:
const _Unwind_Exception_Class __gxx_exception_class = "GNUCC++\0";
【问题讨论】:
看起来你应该在 ekfilter.h 中#include <stdexcept>
包含的内容已经在 ktypes.h 中,这是错误出现的地方。
另外值得注意的是,我必须将#include "Arduino.h" 添加到所有文件中,以便它们也可以为 Arduino 编译。
那么您可能需要重新配置您的 std-lib 以支持异常 (see)
哦,伙计,是的,你完全正确。不知道我是怎么错过的!更改了该库中的系统配置,效果很好!非常感谢!剩下的就是 _P 矩阵错误。
【参考方案1】:
所有问题现已解决。
通过在我的编译器标志中包含 -fexceptions 解决了最后一个错误。
感谢大家的帮助。
【讨论】:
以上是关于在 Arduino DUE 上编译 EKfilter C++ 库时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章
关于Arduino Due开发板在Arduino IDE串口打印问题解决(附Serial函数整理)