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;
}