2017-02-24 3 views
1

ベアメタル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); 
} 

コンパイルが私に与え、この:

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

私はCプログラマではなく、C++ですが、私は、これは、ライブラリの問題であることを理解してください。私はベアメタルシステムでC++を使用する上でいくつかの参考文献を見てきましたが、率直に言って私はまだどのように進めるのか困惑しています。私はmalloc()、free()などの不足しているものを除外したいので、コンパイルを成功させることができます。私はnewh-nostdinC++ -include new.hをコンパイラの呼び出しで使用しようとしましたが、それは動作しませんでした。

私は簡単な間違いをしているのですか、この環境でEigenを愚かな使命にしようとしていますか?どんな指針も大変ありがとうございます。

+1

これはC++ライブラリの一般的な問題だと思うので、一般的なC++のヒントを検索することができます。ところで、ヘッダファイルの標準的な欠落は '.h'拡張子なしの' new'です。これは一歩進んでいくのに役立ちます。あなたが何か動作するようになったら、Eigenの開発者に短いチュートリアルを送ってwiki/docに載せてください。 – ggael

+1

また、他の誰かが(あなただったら?)同様のプラットフォームでEigenを扱うことができました:https://forum.kde.org/viewtopic.php?f=74&t=138964彼にアドバイスを依頼してください。 – ggael

答えて

1

ベアメタルシステムにはメモリアロケータがないため、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); 
} 
1

我々は固有C++ ARMシステムのための私達のベアメタルコード内を多用します。あなたの問題は明らかに一般的には とEigen自身のメモリ割り当てとの相関関係にあります。 ただし 新しいウントのいくつかの簡単なモックアップを削除して構築++ 固定サイズに割り当てられた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; 
} 

その他のリソースは、あなたが考えるかもしれない:私たちは、次のような構文を使用

私は、より多くのリソースを掲載、私のアカウントのみを持っているでしょうそれらの2つを許可します...

関連する問題