Код примера собственного кода не работает при компиляции ARM без ПО

Я хочу оценить Eigen для голой системы 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++ -include new.h при вызове компилятора, но это не сработало.

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


person Phil Schmidt    schedule 24.02.2017    source источник
comment
Я предполагаю, что это общая проблема с библиотеками С++, поэтому вы можете искать общие советы по С++. Кстати, обратите внимание, что стандартный отсутствующий заголовочный файл — new без расширения .h. Это должно помочь вам сделать еще один шаг вперед. Если вам удастся заставить что-то работать, пожалуйста, отправьте краткое руководство разработчикам Eigen, чтобы мы могли его разместить в wiki/doc.   -  person ggael    schedule 24.02.2017
comment
Также кажется, что кому-то еще удалось успешно (разве что вам?) разобраться с Эйгеном на аналогичной платформе: forum.kde.org/viewtopic.php?f=74&t=138964. Не стесняйтесь спрашивать у него совета.   -  person ggael    schedule 24.02.2017


Ответы (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);
}
person Mr. White    schedule 18.06.2017

Мы активно используем Eigen C++ в нашем программном коде для систем ARM. Ваша проблема, очевидно, в целом связана с распределением памяти, а не с самим Eigen. Однако вы можете реализовать это в базовой форме, чтобы использовать большинство выделенных конструкций C++ с фиксированным размером с некоторыми простыми макетами new и delete. Мы использовали такую ​​конструкцию:

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

Другие ресурсы Вы можете рассмотреть:

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

person Thomas Schulze    schedule 19.06.2017