2016-08-12 4 views
1

순수 C-st usb 라이브러리에 프로젝트가 있고이를 C++로 마이 그 레이션하고 동일한 구조를 클래스로 변경해야합니다. (HAL 라이브러리를 제외하고) 내가 .cpp.c에서 모든 파일의 확장자를 변경C C++로 마이 그 레이션 (임베디드)

#ifdef __cplusplus 
extern "C" { 
#endif 

#ifdef __cplusplus 
} 
#endif 

: 내가 좋아하는 모든 C++ "보호"를 제거했습니다. 나는 C++ .hex이 7kB 작고 그 다음에 C .hex임을 깨달았다. 내가 .map 파일을 조사했을 때 나는 많은 기능이 빠져 있음을 알았다. 나는 static 함수가 그것을 일으켰다 고 생각했지만, static 키워드를 제거하는 것이 도움이되지 않았다. 누구나 어떤 기능이 컴파일되지 않았는지 알 수 있습니까? 확장 기능이 .c 일 때 모든 것이 좋습니다.

+1

그냥 레코드 용 : 컴파일러와 링커의 경우 파일 확장명이 부적합합니다. –

+0

재미있는 몇 가지 사항 : 전체 크기에 비해 7kB 작습니까? 함수 정의를 잃어 버렸습니까? 아니면 소프트웨어에서 잃어버린 기능입니까? –

+1

C에서 30kB, C++에서 23kB. 나는 기능을 상실했다. C에서 컴파일 될 때 PC는 내 장치를 인식하지만, C++로 컴파일하면 그렇지 않습니다. – legier

답변

1

C++ 함수에는 C 함수와 다른 서명이 지정됩니다. 기능을 잃었고 코드가 훨씬 작기 때문에 C 링키지가 필요한 함수가 C++로 컴파일되고 서명 불일치로 인해 적절한 연결이 불가능할 수 있습니다.

이 문제가 발생하기 쉬운 곳은 인터럽트 벡터 테이블입니다. 핸들러 함수가 C++ 링키지로 컴파일되면 핸들러 주소는 C로 컴파일 된 테이블에 핸들러 주소를 만들지 않습니다.

인터럽트 벡터를 두 번 확인하여 올바른 함수를 참조하는지 확인하십시오. 올바른 경우, C++로 컴파일 된 외부 기호를 참조 할 수있는 C로 컴파일 된 다른 코드를 확인하십시오.

2

나는 두 가지 이유를 생각할 수 :

  1. 인라인을. 컴파일러는 모든 용도가 인라인 될 수있는 경우 독립 실행 형 함수로 함수를 내보낼 필요가 없다고 결정할 수 있습니다.
  2. 사용하지 않는 코드입니다. 컴파일러는 함수가 코드의 어느 곳에서나 사용되지 않고 최종 결과에서 코드를 제거하기로 결정했음을 알 수 있습니다.

결과가 라이브러리 정렬로 사용되는 경우 사용자 환경에서 코드를 명시 적으로 호출하지 않고 특정 함수를 호출한다고 가정 할 때 가장 좋은 방법은 라이브러리로 코드를 컴파일하고 링크하는 것입니다 (아마도 동적 인 lib) 그리고 라이브러리 인터페이스 (MSVC의 gcc, dllexport에서의 가시성)로 그 함수를 내보내는 것은 컴파일러/링커가 그들이 현재 필요한 이유를 알지 못하더라도 생성 된 바이너리에 그것을 포함하도록 강제 할 것이다. (물론 이것은 타겟 환경에 대한 과장된 추측입니다.)

또 다른 옵션은 데드 코드를 제거하고 인라인 함수의 독립 실행 형 함수 인스턴스를 강제 실행하도록 특정 컴파일러/링커 최적화를 해제하는 것입니다. 매우 간접적 인 접근 방식은 더 큰 효과가 있으며 나중에 유지 관리를 복잡하게 만들 수 있습니다.

관련 문제