首页 文章

无法在Arduino DUE上编译EKfilter C库

提问于
浏览
0

更新:通过实际用this-> operator []实际替换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 for arduino DUE .

使用此库获取std命名空间'https://github.com/maniacbug/StandardCplusplus/'

这是我编译时遇到问题的库:'http://kalman.sourceforge.net/index.php'

我已经将过滤器库移动到这种格式,以便能够使用fr arduino,现在已经能够至少做一个包含但没有找不到头文件:
file screenshot

正如你所看到的,我不得不将文件重命名为.h Headers (不确定这是多么必要),并将文件夹重命名为与.cpp和.h相同的 Headers ,当然还要编辑所有附带的文件以供参考文件不同:例子

#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 :: namespace,而且在代码库中没有任何表面上可能发现错误的东西 .

从我看来,_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:错误:'{'token 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:错误:在数值常量可变矩阵_P之前预期的非限定id; //!<临时矩阵
^
在/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:817:0中包含的文件中,来自TestKalmanLibrary.ino:2:/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:In成员函数'void Kalman :: EKFilter :: init(Kalman :: EKFilter :: Vector&,Kalman :: EKFilter :: Matrix&)':/ Users /insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:196:8 :error:请求'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); //保持此调整大小
^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:439:15:error:表达式不能用作函数_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:error:expression不能用作函数_P(j,i)= _P(i,j);
^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:450:27:error:expression不能用作函数_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:error:expression不能用作函数_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 :: allocator; 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:注意:如果(Tr :: eq(str [j],operator [](i))){{s :: eq(str [j],operator [](i))),则无法通过非限定查找找到依赖库'std :: vector>'中的声明
^
/ Users / insertnamehere / Documents / Arduino / libraries / StandardCplusplus-master / string:518:64:注意:使用'this-> operator []'代替错误编译 .

所以这里有很多要解决的问题,但这是在我修复了已经格式化库的方式之后的问题:

我不得不在“/boards.txt”中添加-fpermissive来编译首选项

他们的代码中有一个奇怪的实现,无法编译,我改变了这个:

// 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";

1 回答

  • 0

    所有问题现在都已解决 .

    通过在我的编译器标志中包含-fexceptions来解决上一个错误 .

    谢谢你的帮助 .

相关问题