Я хочу оценить собственный для голой металлической системы 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 в этой среде глупое поручение? Любое руководство будет с благодарностью.
В «голой железной» системе нет распределителя памяти, поэтому использовать 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);
}
Мы интенсивно используем 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;
}
Другие ресурсы, которые вы могли бы рассмотреть:
Я бы опубликовал больше ресурсов, но мой аккаунт позволяет использовать только два из них …