2013-08-08 1 views
0

STM32F4 마이크로 컨트롤러 용 C++ 애플리케이션을 컴파일 중입니다. 내 모든 코드가 성공적으로 컴파일하지만 링크 단계는 다음과 같은 오류와 함께 실패합니다 내가 주없이 응용 프로그램을 컴파일하려고입니다 주요 오류로 정의되지 않은 참조, 의 일반적인 원인을 잘 알고LoopFillZerobss에 정의되지 않은 참조가 있습니다.

/tmp/ccGj7Wge.o: In function `LoopFillZerobss': 
(.text.Reset_Handler+0x32): undefined reference to `main' 
collect2: error: ld returned 1 exit status 

선물. 그러나 main.cpp가 있고 당연히 main 함수가 있습니다. main.o로 컴파일되며이 파일은 컴파일하는 동안 으로 생성 된 다른 오브젝트 파일과 링크됩니다.

STM32F407에 크로스 컴파일 중이므로 베어 메탈을 실행 중입니다.

누구든지이 사실에 대해 통찰력을 갖고 있습니까? 아니면이 오류를 본적이 있습니까? LoopFillZerobss 함수를 볼 수있는 유일한 곳은 보드의 어셈블리 시작 파일입니다.

+0

그래서 코드에'main'이 없습니까? 'LoopFillZerobss'는 아마도'main' 이전의 초기화 코드의 일부일 것입니다 - 전역 변수를 0으로 설정해야하기 때문에 C 및 C++에서 block-storage-section을 0으로 채우는 것이 초기화의 일부입니다. –

답변

1

확인 사항 :

  • 가 제대로 main를 선언해야합니다. 예를 들어 int main(void) 또는 int main(int argc, char **argv)이고 void main(void)이 아님. What is the proper declaration of main?
  • 실수로 namespacemain 포장하지 않았는지 확인이 스택 오버플 기사는 훌륭한 일을한다.
  • 당신은 매우 기발한 C의 ++ 컴파일러가있는 경우, 당신은 extern "C"으로 main를 표시 할 수 있지만, 매우 정직해야, 내가 그 필요 도구를 본 적이있다.

당신은 거기에 nm 같은 도구를 실행하여 main.o에 의해 정의있어 어떤 기호를 볼 수 있어야합니다. (적어도, GNU 툴 체인과 같은 유닉스 스타일의 툴 체인은 nm 도구를 제공합니다. nm은 실행 파일로 정의 된 심볼 세트를 나열합니다. main이있는 것으로 보입니다.

예를 들어, 내 리눅스 박스, 나노에서 다음 출력 그렇지 않으면 빈 .cpp 파일 결과에 int main(void) { }에 :

$ nm main.o 
       U __gxx_personality_v0 
0000000000000000 T main 

나는 (이 경우 namespace fred에) 네임 스페이스에 main 포장, 난 이 같은 변환 된 이름을 얻을 :

$ nm main.o 
0000000000000000 T _ZN4fred4mainEv 
       U __gxx_personality_v0 

주의 이름 main 주위의 추가 맞지 않는 철자. 너는 nm 산출물에 그러한 덤불을 볼 수 없어야한다.

정확히 main을 선언하고 우연히 이름 공간에 놓지 않았는지 확인해야합니다. 일단 그것이 정렬되면, 초기화 루틴 LoopFillZerobss은 훨씬 더 행복해야합니다.

+0

감사합니다.내 주체가 네임 스페이스에 싸여 있었지만 이제 모든 것이 올바르게 작동합니다! –

관련 문제