ARDUINO到期时编译EKFLASE C++库故障
更新:通过实际使用->运算符[]替换运算符[],修复了最终错误 更新2:逻辑错误修复! _P错误是所有剩下的!它只在适当的时候出现,而不是UNO或其他董事会 更新3:将临时矩阵的名称更改为_ptworked,可能是一个保留宏 新错误:ARDUINO到期时编译EKFLASE C++库故障,c++,arduino,arduino-due,C++,Arduino,Arduino Due,更新:通过实际使用->运算符[]替换运算符[],修复了最终错误 更新2:逻辑错误修复! _P错误是所有剩下的!它只在适当的时候出现,而不是UNO或其他董事会 更新3:将临时矩阵的名称更改为_ptworked,可能是一个保留宏 新错误: Arduino: 1.6.1 (Mac OS X), Board: "Arduino Due (Programming Port)" /Users/zackbright/Documents/Arduino/libraries/StandardCplusplus-
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.
看起来我需要使用-feexceptions
本报告将提供更多信息
在编译期间显示详细输出
在文件>首选项中启用
这里有很多,但我希望付出一切是我应该做的,以得到一个好的答案
将Arduino 1.6.1用于OSX上到期的Arduino
使用此库获取std名称空间
这是我在编译时遇到问题的库:
我已经将过滤器库转换为这种格式,以便能够在arduino中使用它,现在至少能够在没有找到头文件的情况下进行包含:
如您所见,我必须将文件重命名为.h标题,但不确定这是否有必要,并将文件夹重命名为与我的.cpp和.h标题相同的标题,当然,还必须编辑所有随附文件以不同方式引用文件:
范例
现在是这样的:
#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:
}
在/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector.h:37:0中包含的文件中,
from/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::KalmanErrorconst string&”中:
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ktypes.h:82:9:错误:
类“Kalman::KalmanError”没有任何名为“logic\u error”的字段
: logic_error(message) {}
^
在/Users/insertnamehere/Documents/Arduino/libraries/standardclusplus master/cctype:19:0包含的文件中,
来自/Users/insertnamehere/Documents/Arduino/libraries/standardclusplus master/istream:21,
来自/Users/insertnamehere/Documents/Arduino/libraries/standardclusplus master/iostream:27,
来自/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector.h:35,
from/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_impl.h:在成员函数“const Matrix&Kalman::ekfilter::calculateP const”中:
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:435:10:错误:请求在非类类型为“int”的“16”中的成员“resize”
_P.swap(P_);
^
_P.resize(n, n); // keep this resize
^
_P.resize(n, nn);
^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:439:15:错误:表达式不能用作函数
_P(i,i) = U(i,i);
^
_P(i,j) = U(i,j)*U(j,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,j) += U(i,k)*U(j,k)*U(k,k);
^
_P(j,i) = _P(i,j);
^
_P(j,i) = _P(i,j);
^
U(i,j) = _P(i,j);
^
_P(i,j) = U(i,j);
^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:443:17:错误:表达式不能用作函数
_P(i,i) = U(i,i);
^
_P(i,j) = U(i,j)*U(j,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,j) += U(i,k)*U(j,k)*U(k,k);
^
_P(j,i) = _P(i,j);
^
_P(j,i) = _P(i,j);
^
U(i,j) = _P(i,j);
^
_P(i,j) = U(i,j);
^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:444:17:错误:表达式不能用作函数
_P(i,i) = U(i,i);
^
_P(i,j) = U(i,j)*U(j,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,j) += U(i,k)*U(j,k)*U(k,k);
^
_P(j,i) = _P(i,j);
^
_P(j,i) = _P(i,j);
^
U(i,j) = _P(i,j);
^
_P(i,j) = U(i,j);
^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:444:35:错误:表达式不能用作函数
_P(i,i) = U(i,i);
^
_P(i,j) = U(i,j)*U(j,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,j) += U(i,k)*U(j,k)*U(k,k);
^
_P(j,i) = _P(i,j);
^
_P(j,i) = _P(i,j);
^
U(i,j) = _P(i,j);
^
_P(i,j) = U(i,j);
^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:447:19:错误:表达式不能用作函数
_P(i,i) = U(i,i);
^
_P(i,j) = U(i,j)*U(j,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,j) += U(i,k)*U(j,k)*U(k,k);
^
_P(j,i) = _P(i,j);
^
_P(j,i) = _P(i,j);
^
U(i,j) = _P(i,j);
^
_P(i,j) = U(i,j);
^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:450:17:错误:表达式不能用作函数
_P(i,i) = U(i,i);
^
_P(i,j) = U(i,j)*U(j,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,j) += U(i,k)*U(j,k)*U(k,k);
^
_P(j,i) = _P(i,j);
^
_P(j,i) = _P(i,j);
^
U(i,j) = _P(i,j);
^
_P(i,j) = U(i,j);
^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:450:27:错误:表达式不能用作函数
_P(i,i) = U(i,i);
^
_P(i,j) = U(i,j)*U(j,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,j) += U(i,k)*U(j,k)*U(k,k);
^
_P(j,i) = _P(i,j);
^
_P(j,i) = _P(i,j);
^
U(i,j) = _P(i,j);
^
_P(i,j) = U(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:错误:表达式不能用作函数
_P(i,i) = U(i,i);
^
_P(i,j) = U(i,j)*U(j,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,j) += U(i,k)*U(j,k)*U(k,k);
^
_P(j,i) = _P(i,j);
^
_P(j,i) = _P(i,j);
^
U(i,j) = _P(i,j);
^
_P(i,j) = U(i,j);
^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:583:10:错误:请求在非类类型为“int”的“16”中的成员“resize”
_P.swap(P_);
^
_P.resize(n, n); // keep this resize
^
_P.resize(n, nn);
^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:586:17:错误:表达式不能用作函数
_P(i,i) = U(i,i);
^
_P(i,j) = U(i,j)*U(j,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,i) += U(i,j)*_P(i,j);
^
_P(i,j) += U(i,k)*U(j,k)*U(k,k);
^
_P(j,i) = _P(i,j);
^
_P(j,i) = _P(i,j);
^
U(i,j) = _P(i,j);
^
_P(i,j) = U(i,j);
^
在/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector.h:34:0中包含的文件中,
from/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:33
,
来自TestKalmanLibrary.ino:2:
/Users/insertnamehere/Documents/Arduino/libraries/standardclusplus master/string:In'std::basic_string::size_type std::basic_string::find_first_of const std::basic_string&,std::basic_string::size_type const[with Ch=char;Tr=std::char\u 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/standardclusplus master/string:518:64:注意:通过非限定查找未找到依赖基“std::vector>”中的声明
if( Tr::eq(str[j], operator[](i)) ){
^
/Users/insertnamehere/Documents/Arduino/libraries/standardclusplus-master/string:518:64:注意:请改用“this->operator[]”
编译时出错
这里有很多问题需要解决,但这都是在我解决了库的格式化方式的一些问题之后:
我必须在/boards.txt编译首选项中添加-fppermissive
他们的代码中有一个奇怪的实现无法编译,我改变了这一点:
// 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');
所有问题现在都解决了 通过在我的编译器标志中包含-feexceptions解决了上一个错误
谢谢大家的帮助。看起来你应该在ekfilter.h中包含include,它已经在ktypes.h中了,这就是出现错误的地方。另外值得注意的是,我必须将include Arduino.h添加到所有文件中,以便它们也可以为Arduino编译。然后你可能需要重新配置std库,并提供异常支持哦,伙计,是的,你完全正确。不知道我怎么会错过!更改了库中的系统配置,很好!非常感谢!剩下的就是P矩阵误差。