C++ 特征示例代码未能通过ARM裸机编译
我想评估一个裸机手臂系统。以下是我试图编译的内容:C++ 特征示例代码未能通过ARM裸机编译,c++,eigen,bare-metal,C++,Eigen,Bare Metal,我想评估一个裸机手臂系统。以下是我试图编译的内容: #include <Eigen/Dense> using Eigen::MatrixXd; void test() { MatrixXd m(2,2); m(0,0) = 3; m(1,0) = 2.5; m(0,1) = -1; m(1,1) = m(1,0) + m(0,1); } 我是C程序员,不是C++,但是我知道这是一个图书馆问题。我曾经看过一些关于在纯金属系统上使用C++的参考文献,但坦率地说,我
#include <Eigen/Dense>
using Eigen::MatrixXd;
void test()
{
MatrixXd m(2,2);
m(0,0) = 3;
m(1,0) = 2.5;
m(0,1) = -1;
m(1,1) = m(1,0) + m(0,1);
}
<>我是C程序员,不是C++,但是我知道这是一个图书馆问题。我曾经看过一些关于在纯金属系统上使用C++的参考文献,但坦率地说,我还是有点困惑。我只想去掉缺少的东西,比如malloc()、free()等等,这样我就可以成功编译。我已经尝试在编译器调用中使用我自己的new.h和-nostinc++-include new.h,但没有成功
我是犯了一个简单的错误,还是试图在这种环境中使用Eigen是一件傻事?非常感谢您的指导。裸机系统没有内存分配器,因此不能使用new和delete。 使用固定大小矩阵的代码应该可以工作:
#define EIGEN_NO_MALLOC
#include <Eigen/Dense>
using Eigen;
void test()
{
Matrix2d m;
m(0,0) = 3;
m(1,0) = 2.5;
m(0,1) = -1;
m(1,1) = m(1,0) + m(0,1);
}
#定义特征值(不)MALLOC
#包括
使用特征值;
无效测试()
{
矩阵2dm;
m(0,0)=3;
m(1,0)=2.5;
m(0,1)=-1;
m(1,1)=m(1,0)+m(0,1);
}
我们在我们的裸机代码中大量使用了特征C++
ARM系统。很明显,你的问题大体上是相关的
内存分配,而不是特征本身。
但是,您可以以基本形式实现这一点,以使用大多数
固定大小分配C++构造与一些简单的模型
新建和删除。我们使用了如下构造:
extern"C"
void *malloc(size_t){
return (void*)(0);
}
extern"C"
void free(void*){};
// C++ mini-definition of new & delete and aeabi_atexit:
void* operator new(size_t size, const std::nothrow_t& nothrow_value)throw(){
return malloc(size);
}
void* operator new(size_t size) {
return malloc(size);
}
void operator delete(void* p) throw(){
free(p);
}
extern"C"
int __aeabi_atexit(void*,void(*)(void*),void*){
return 0;
}
您可能会考虑的其他资源:
<>我会发布更多的资源,但是我的帐户只允许其中两个……/p>我猜这是C++库的一个普遍问题,所以你可以搜索一般的C++提示。顺便说一句,请注意标准缺少的头文件是
new
,没有扩展名.h
。这将帮助您更进一步。如果您设法让某些东西发挥作用,请向Eigen的开发人员发送一个简短的教程,以便我们可以在wiki/doc上使用。此外,似乎还有其他人(除非是您?)成功地在类似的平台上与Eigen打交道:。请随便问他意见。
extern"C"
void *malloc(size_t){
return (void*)(0);
}
extern"C"
void free(void*){};
// C++ mini-definition of new & delete and aeabi_atexit:
void* operator new(size_t size, const std::nothrow_t& nothrow_value)throw(){
return malloc(size);
}
void* operator new(size_t size) {
return malloc(size);
}
void operator delete(void* p) throw(){
free(p);
}
extern"C"
int __aeabi_atexit(void*,void(*)(void*),void*){
return 0;
}