2017-02-24 19 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++ 팁을 검색 할 수 있습니다. BTW, 표준 누락 헤더 파일은'.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

우리는 ARM 시스템을위한 우리의 베어 메탈 코드 아이겐 C++를 많이 사용합니다. 당신의 문제는 분명히 일반적으로 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; 
} 

기타 리소스 당신은 고려해 볼 수 있습니다 : 우리는 다음과 같은 구문을 사용

나는 더 많은 자원을 게시,하지만 내 계정 만 것 그중 두 가지를 허용합니다 ...