2017-02-24 8 views
1

Ich möchte Eigen für ein Bare-Metal-ARM-System zu bewerten. Hier ist, was ich versuche zu kompilieren:Eigen Beispiel Code schlägt ARM Bare-Metal Compilieren

#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 gibt mir dies:

[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. 

Ich bin ein C-Programmierer, nicht C++, aber ich verstehe, dass dies ein Problem ist, Bibliothek. Ich habe mir einige Hinweise zur Verwendung von C++ auf Bare-Metal-Systemen angeschaut, aber ehrlich gesagt bin ich immer noch etwas verwirrt darüber, wie es weitergehen soll. Ich möchte nur die fehlenden Sachen, die malloc(), free(), etc. sind, ausheften, damit ich eine erfolgreiche Kompilierung bekommen kann. Ich habe versucht, meine eigene new.h mit -nostdinC++ -include new.h auf den Compiler-Aufruf, aber das hat nicht funktioniert.

Mache ich einen einfachen Fehler, oder versuche Eigen in dieser Umgebung einen Narrenauftrag zu verwenden? Jede Anleitung würde sehr geschätzt werden.

+1

Ich denke, das ist ein generelles Problem mit C++ - Bibliotheken, so dass Sie nach allgemeinen C++ - Tipps suchen können. Übrigens, beachten Sie, dass die fehlende Header-Standarddatei "neu" ohne die Erweiterung ".h" ist. Dies sollte Ihnen helfen, einen Schritt weiter zu gehen. Wenn es dir gelingt, etwas zum Laufen zu bringen, sende bitte ein kurzes Tutorial an Eigens Entwickler, damit wir es auf dem Wiki/doc machen können. – ggael

+1

Es scheint auch, dass jemand anderes (mit Ausnahme von Ihnen?) Erfolgreich mit Eigen auf einer ähnlichen Plattform umgehen konnte: https://forum.kde.org/viewtopic.php?f=74&t=138964. Fühlen Sie sich frei, ihm Ratschläge zu stellen. – ggael

Antwort

1

Das Bare-Metal-System hat keinen Speicherzuordner, daher kann new und delete nicht verwendet werden. -Code mit fester Größe Matrizen sollte funktionieren:

#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

Wir starke Nutzung von Eigen C++ machen in unserem Bare-Metal-Code für ARM-Systeme. Ihr Problem ist offensichtlich im Allgemeinen mit Speicherzuordnung nicht zu Eigen selbst korreliert. Sie können dies jedoch implementieren in einer Grundform die meisten fester Größe zugewiesen C++ mit einigen einfachen Mockup-Konstrukte von neue und löschen. Wir haben ein Konstrukt wie folgt aus:

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

Andere Ressourcen Sie sollten erwägen:

ich hätte mehr Ressourcen geschrieben, aber mein Konto nur erlaubt zwei von ihnen ...