인라인 함수 사용시 발생하는 ‘Undefined external’ 메시지 해결하기

기술노트 49981

아키텍처:

All

컴포넌트:

compiler

업데이트:

2021-05-11 오전 7:51

소개

때로 인라인 함수를 포함하는 C 소스 파일에 대해 링커 에러메시지가 발생하는 이슈가 있습니다. 다음과 같은 에러 메시지를 발생시킵니다:

  • Error[e46]: Undefined external ... (from XLINK)
  • Error[Li005]: no definition for ... (from ILINK)

본 기술 노트는 이러한 상황을 해결하는 방법에 대해 설명합니다.

논의

컴파일러가 일부 기본적인 조건(인라인 함수의 경우)을 충족하지 못하기에 링커 에러가 발생합니다. 따라서 다음 사항을 파악하고 그에 따라 C 소스를 변경합니다:

  • 컴파일러가 컴파일 시간에 인라인 함수에 대한 정의를 볼 수 있어야 합니다.
  • 만약 인라인 함수가 정확히 하나의 .c 파일에서 사용되는 경우, 정의부를 해당 .c 파일로 이동시킵니다.
  • 여러 .c 파일에서 인라인 함수를 사용하는 경우:

    1. 함수의 정의를 .h 파일에 넣습니다.
          // To be present in a .h file (for example foo.h), 
          // typically included by many .c files. 
          inline unsigned char foo(unsigned char c) 
          { 
             return (c+1); 
          }​
    2. 그 .h 파일을 함수의 호출이 일어나는 모든 .c파일에 포함시킵니다.
    3. 인라인 함수의 외부 선언이 있는 정확히 하나의 .c파일이 있는지 확인합니다.
      // To be present in precisely one (1) .c file
      // (for example foo.c)
      extern inline unsigned char foo(unsigned char c);​​​

 

1번과 2번은 간단합니다. 하지만 3번 이해하기 어려울 수 있습니다. C ISO 표준에 의하면 : '...인라인 정의는 함수에 대한 외부 정의를 제공하지 않는다...' 따라서 (3번 같은) 외부 선언은 함수에 대한 인라인이 아닌 참조를 해결하기 위해 (링커에 의해) 사용됩니다.

결론

인라인 함수를 포함하는 C 소스코드에 제약이 있습니다. 예를 들어, 인라인 함수가 static 기호에 의해 참조되지 않도록 확인하여야 합니다. (변수와 함수 둘다 안되도록)

자세한 정보를 위해, Inlining functions (in the Development Guide or in the Compiler Reference Guide) 를 참고하세요.

모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.

죄송하지만, 당사 사이트에서는 Internet Explorer를 지원하지 않습니다.보다 편안한 사이트를 위해 Chrome, Edge, Firefox 등과 같은 최신 브라우저를 사용해 주시길 부탁드립니다.