2012-01-23 2 views
2

내 MIPS 기반 임베디드 장치에 C 대신 C++로 내 응용 프로그램을 빌드하려고합니다. 먼저, here을 볼 수있는 링크 문제가 있습니다. 이 문제가 해결되어 성공적으로 애플리케이션을 구축 할 수있었습니다. 이제 std::vector 클래스를 사용하고 싶습니다. 내 코드는 다음 vector<char> v; 라인이 실행되면벡터 사용으로 인한 세그먼트 오류

#include <vector> 
using namespace std; 

int main() { 
    vector<char> v; 
    v.push_back('s'); 

    return 0; 
} 

Segment Fault 메시지가 화면에 나타납니다. 더 많은 테스트를 위해 나는 new 연산자를 테스트했는데 정상적으로 작동합니다. 내 응용 프로그램을 빌드하려면 mipsel-elf-g++을 사용하고 있습니다.

무엇이 잘못 되었나요?

+5

이전 질문에서 볼 때 C++ 컴파일러 꽤 부서집니다. 'malloc'과'new'가 처음 사용되면,'std :: vector'는 그렇게되지 않을 것입니다. http://stackoverflow.com/questions/8956979/segment-fault-caused-by-using-new-and-malloc – NPE

+0

코드가 정상적으로 보입니다. 세그 폴트라면 주위를 둘러싼 작업으로 '벡터'를 선언하는 동안 공간을 할당 할 수 있습니다. 즉 '벡터 v (100);'을 입력하고 시도해보십시오. – iammilind

+0

@aix :'malloc'과'new' 문제가 수정되어 이제 둘 다 사용할 수 있습니다. 내 질문에 나는 '새로운 연산자를 테스트했는데 메모리 할당 문제가 있다는 것을 강조하기 위해 잘 작동한다'고 언급한다. –

답변

1

mips 용 C++ 라이브러리를 크로스 빌드했다고 가정합니다. 라이브러리가 제대로 빌드되어 있고 실제로 밉에 맞게 구성되었는지 확인하십시오. 또한 gdb에서 실행 파일을로드하고 충돌이 발생한 곳을 정확히 볼 수 있습니다. 나는 그것이 libC++의 어딘가에서 일어난다 고 생각할 것이다.

+0

저는 초보자 임베디드 프로그래머이고'MIPS'를위한 C++ 라이브러리를 어떻게 만들 수 있는지 알지 못합니다. 나는'cygwin'을 사용하고 있습니다. 크로스 - 빌드 된 C++ 라이브러리를 만들기 위해서는 어떻게해야합니까? –

+0

MIPS 크로스 컴파일러 슈트는 Cygwin에서 사용할 수 있습니까? 실제로 올바른 컴파일러를 사용하고 있는지 확인하십시오. 다양한 MIPS 파생물이 있으며 컴파일러 수트는 _your_ MIPS 사양에 맞아야합니다. – boto

+0

'Cygwin'에 존재하는'mipsel-elf-gcc'와'mipsel-elf-g ++'컴파일러를 사용하고 있습니다. 나는 이것이 적당한 지 모른다. –

2

주석에서 언급했듯이 컴파일러 및/또는 런타임 라이브러리가 손상되었습니다. ("elf"타겟은 타겟에서 OS를 실행하지 않는다는 것을 의미하기 때문에 OS를 배제 할 수 있습니다. 존재하지 않으면 깨질 수 없습니다.)

Cygwin의 mipsel-elf-gcc 패키지를 디버깅 할 수 있습니다.이 패키지는 오래되어 잘 테스트되지 않았기 때문에 다른 컴파일러를 사용하는 것이 좋습니다. 특히 멘토 그래픽스의 "Sourcery CodeBench Lite Edition"GCC 컴파일러와 관련된 C 및 C++ 라이브러리는 http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/에서 무료로 다운로드 할 수 있습니다. 기본적으로 Cygwin 컴파일러 대신에 드롭 인 대체품으로 작동해야합니다. Cygwin 경로를 정상적으로 "일반 Windows"컴파일러로 빌드 했더라도 Cygwin 경로로 올바르게 작업하는 것을 포함하여) 실제로 테스트를 거쳐 실제로 올바르게 작동하는지 확인했습니다.

[면책 조항 : 나는 Mentor Graphics에서 일하기 때문에 나는 편파적이라고 말할 수는 없다. 그러나 우리는이 컴파일러가 작동하도록 많은 노력을 기울 였고, MIPS와 계약을 맺어 세상은 무료입니다. 그래서 우리는 그것이 올바르게 작동하도록 인센티브를 얻습니다. 또한 CodeSourcery "Sourcery G ++"컴파일러에 익숙하다면 "Sourcery CodeBench"가 CodeSourcery가 Mentor Graphics의 일부가 된 새로운 이름입니다.

관련 문제