在Arduino上编译EKfilter C ++库时出现问题DUE

时间:2015-04-26 16:53:34

标签: c++ arduino arduino-due

更新:通过实际用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 for arduino DUE。

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

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

我已经将过滤器库移动到这种格式,以便能够使用fr arduino,现在至少可以在没有找到头文件的情况下执行包含: file screenshot

正如你所看到的,我必须将文件重命名为.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 :: 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:错误:在&#39; {&#39;之前预期的类名令牌

struct KalmanError : public std::logic_error {
                                            ^
     

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ktypes.h:在构造函数&#39; Kalman :: KalmanError :: KalmanError(const string&amp;)&#39;:   /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ktypes.h:82:9:错误:

     

class&#39; Kalman :: KalmanError&#39;没有任何名为&#39; logic_error&#39;

的字段
   : 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:

     

错误:数字常量

之前的预期unqualified-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:在成员函数&#39; void Kalman :: EKFilter :: init(Kalman :: EKFilter :: Vector&amp;,Kalman :: EKFilter :: Matrix&amp; )&#39;:

     

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:196:8:错误:

     

请求成员&#39;交换&#39;在&#39; 16&#39;中,这是非类型的&#39; int&#39;

 _P.swap(P_);
    ^
     

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:在成员函数&#39; const Matrix&amp; Kalman :: EKFilter :: calculateP()const&#39;:   /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:435:10:错误:请求会员&#39;调整大小&#39;在&#39; 16&#39;中,这是非类型的&#39; int&#39;

   _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:在成员函数&#39;虚拟void Kalman :: EKFilter :: sizeUpdate()&#39;:   /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:错误:请求会员&#39;调整大小&#39;在&#39; 16&#39;中,这是非类型的&#39; int&#39;

   _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:实例化&#39; std :: basic_string :: size_type std :: basic_string :: find_first_not_of(const std :: basic_string&amp;,std :: basic_string :: size_type)const [with Ch = char; Tr = std :: char_traits; A = std :: allocator; std :: basic_string :: size_type = unsigned int]&#39;:   /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector_impl.h:66:42:从这里要求   / Users / insertnamehere / Documents / Arduino / libraries / StandardCplusplus-master / string:518:64:note:依​​赖库中的声明&#st; :: vector&gt;&#39;没有资格的查找找不到

                             if( Tr::eq(str[j], operator[](i)) ){
                                                            ^
     

/ Users / insertnamehere / Documents / Arduino / libraries / StandardCplusplus-master / string:518:64:note:use&#39; this-&gt; operator []&#39;代替   编译错误。

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

我必须添加-fpermissive到&#34; /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";

1 个答案:

答案 0 :(得分:0)

现在已解决所有问题。

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

感谢帮助人员。