2017-02-24 78 views
1

我想評估一個裸機ARM系統的Eigen。以下是我想要編譯: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()等等,這樣我就可以成功編譯了。我試過用我自己的new.h-nostdinC++ -include new.h對編譯器的調用,但沒有奏效。

我是犯了一個簡單的錯誤,還是試圖在這個環境中使用Eigen傻瓜的差事?任何指導將不勝感激。

+1

我想這是C++庫的一個普遍問題,所以你可以搜索一般的C++技巧。順便說一下,請注意,標準缺失頭文件是'new',不帶'.h'擴展名。這應該可以幫助你更進一步。如果你能設法解決問題,請向Eigen的開發者發送一個簡短的教程,以便我們可以在wiki/doc上找到它。 – ggael

+1

另外,似乎有人成功(除非是你?)設法在類似的平臺上與Eigen打交道:https://forum.kde.org/viewtopic.php?f = 74&t = 138964。隨意問他的建議。 – ggael

回答

1

裸機系統沒有內存分配器,所以不能使用新建和刪除。使用固定大小的矩陣 代碼應工作:

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

其他資源你可能會考慮:

我會發布更多的資源,但只有我的帳戶允許其中兩個...