Собственный пример кода завершается неудачной компиляцией ARM

Я хочу оценить собственный для голой металлической системы ARM. Вот что я пытаюсь скомпилировать:

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

Компиляция дает мне это:

phil@Mint-Virtual ~/Projects/Eigen $ /usr/bin/arm-none-eabi-g++ -I ./eigen-eigen-3.3.3 test.cpp -o test.o
In file included from ./eigen-eigen-3.3.3/Eigen/Dense:1:0,
from test.cpp:5:
./eigen-eigen-3.3.3/Eigen/Core:66:17: fatal error: new: No such file or directory
compilation terminated.

Я программист на C, а не на C ++, но я понимаю, что это проблема библиотеки. Я рассмотрел несколько ссылок на использование C ++ в системах с «голым железом», но, честно говоря, я все еще немного озадачен тем, как действовать дальше. Я хотел бы просто убрать недостающий материал, который выглядит как malloc (), free () и т. Д., Чтобы я мог получить успешную компиляцию. Я пытался использовать свой собственный new.h с -nostdinc ++ -включить new.h на вызове компилятора, но это не сработало.

Я делаю простую ошибку, или пытаюсь использовать Eigen в этой среде глупое поручение? Любое руководство будет с благодарностью.

2

Решение

В «голой железной» системе нет распределителя памяти, поэтому использовать 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);
}
2

Другие решения

Мы интенсивно используем Eigen 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;
}

Другие ресурсы, которые вы могли бы рассмотреть:

Я бы опубликовал больше ресурсов, но мой аккаунт позволяет использовать только два из них …

1

По вопросам рекламы [email protected]