2017-02-24 2 views
1

Je souhaite évaluer Eigen pour un système ARM sans métal. Voici ce que je suis en train de compiler:Échec du code d'exemple Exemple de compilation ARM 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); 
} 

Compilation me donne ceci:

[email protected] ~/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. 

Je suis un programmeur C, pas C++, mais je comprends que cela est un problème de bibliothèque. J'ai regardé plusieurs références sur l'utilisation de C++ sur des systèmes sans métal, mais franchement, je suis encore un peu perplexe sur la façon de procéder. Je voudrais simplement remplacer les éléments manquants, qui semblent être malloc(), free(), etc., afin que je puisse obtenir une compilation réussie. J'ai essayé d'utiliser mon propre new.h avec -nostdinC++ -include new.h sur l'appel du compilateur, mais cela n'a pas fonctionné. Est-ce que je commets une erreur simple, ou est-ce que j'essaie d'utiliser Eigen dans cet environnement une course de fou? Toute orientation serait grandement appréciée.

+1

Je suppose que c'est un problème général avec les bibliothèques C++, donc vous pouvez rechercher des astuces générales en C++. BTW, notez que le fichier d'en-tête manquant standard est 'new' sans l'extension' .h'. Cela devrait vous aider à aller plus loin. Si vous parvenez à faire fonctionner quelque chose, envoyez un petit tutoriel aux développeurs d'Eigen pour que nous puissions le faire sur le wiki/doc. – ggael

+1

Il semble également que quelqu'un d'autre réussit (à moins que ce soit vous?) À gérer Eigen sur une plate-forme similaire: https://forum.kde.org/viewtopic.php?f=74&t=138964. N'hésitez pas à lui demander des conseils. – ggael

Répondre

1

Le système Bare Metal ne possède pas d'allocateur de mémoire, de sorte que le nouveau système et la suppression ne peuvent pas être utilisés. code à l'aide des matrices de taille fixe devrait fonctionner:

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

Nous faisons un usage intensif de Eigen C++ dans notre code métal nu pour systèmes ARM. Votre problème est évidemment en corrélation à l'allocation de mémoire pas à Eigen lui-même. Vous pouvez toutefois mettre en œuvre ce sous une forme de base pour utiliser la plupart des de taille fixe alloué C++ construit avec une mockup simple nouvelle und supprimer. Nous avons utilisé une construction comme suit:

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

Autres ressources Vous pourriez envisager:

J'ai posté plus de ressources, mais mon compte seulement permet à deux d'entre eux ...