2016-12-19 13 views
-2

저는 최근에 debian 테스트를 업그레이드 한 후 gcc 6.2.1 컴파일러를 사용하여 코드 조각을 컴파일하는 문제에 봉착했습니다.gcc가 -O2없이 인라인 함수를 수행하지 못합니다.

inline int func(void) { 
    return 0; 
} 

int main (int argc, char **argv) { 
    func(); 
} 

코드는 다음과 같이 하지 컴파일 않습니다 :이 간단한 예제로 내려 삶은 한

undefined reference to 'func'

: 그것은 실패

gcc -o exec code.C# gcc 6.2.1

나는 또한 동일한 호스트에서 gcc 4.8, 4.9 및 5를 시도하고 실패했습니다. 내가 추가 할 경우 컴파일 않습니다

gcc -o exec code.c -O2 # gcc 6.2.1

내가는 -O2 플래그와 함께 작동 이유에 정말 궁금하지만하지 않고, 난이 일을 기대?

+6

"코드가 컴파일되지 * 않습니다 *"라고하는 것은 무엇을 의미합니까? 어떤 오류가 발생합니까? 컴파일러에서 전체, 완전 및 편집되지 않은 출력을 포함하도록 질문을 편집하십시오. –

+1

'인라인'이 반복하는 횟수는 ... 반복적으로 ... – DeiDei

+2

'func' 문에'return' 문이 없기 때문에 프로그램이 컴파일되지 않습니다. 기능. 컴파일러의 오류 메시지는 매우 명확합니다. –

답변

1

컴파일러 명령에 "-O"옵션을 추가하십시오. 인라인은 최적화가 활성화 된 경우에만 켜집니다.

C99 인라인 함수 기본적으로

는 연타는 GNU C11 모드에서 C 코드를 구축, 그래서 인라인 키워드에 대한 표준 C99 의미를 사용합니다. 이러한 의미는 GNU C89 모드의 의미와 다르며, 이는 5.0 이전의 GCC 버전의 기본 모드입니다. 예를 들어, 다음 코드를 살펴

C99에서
inline int add(int i, int j) { return i + j; } 

int main() { 
    int i = add(4, 5); 
    return i; 
} 

는 인라인 함수의 정의는 인라인을 제공함을 의미하며, 프로그램의 다른 곳 (인라인없이) 또 다른 정의는이 있음. 즉,이 프로그램은 불완전합니다. 왜냐하면 add가 인라인되지 않으면 (예 : 최적화없이 컴파일 할 때), main은 다른 정의에 대한 미해결 참조를 가질 것이기 때문입니다. 따라서 우리는이 같은 (정확한) 링크 타임 오류가 발생합니다 : 반대로

Undefined symbols: 
    "_add", referenced from: 
     _main in cc-y1jXIr.o 

는, (GCC의 이전 버전에서 기본적으로 사용) GNU C89 모드는 C89 표준 플러스 확장의 많은입니다. C89에는 인라인 키워드가 없지만 GCC는이 키워드를 확장자로 인식하고이를 옵티마 이저에 대한 힌트로 처리합니다.

  1. 변경 정적 인라인 함수에 추가 :

    는이 문제를 해결하는 방법은 여러 가지가 있습니다. 하나의 번역 단위에서만이 기능을 사용해야하는 경우에 일반적으로 적합한 솔루션입니다. 정적 인라인 함수는 항상 번역 단위 내에서 해석되므로 프로그램의 다른 곳에서 함수의 비 인라인 정의를 추가 할 필요가 없습니다.

  2. add에 대한이 정의에서 inline 키워드를 제거하십시오. inline 키워드는 함수가 인라인 될 필요가 없으며, 인라인 될 수 있음을 보장하지 않습니다. 일부 컴파일러는이를 완전히 무시합니다. Clang은 그것을 프로그래머로부터 온화한 제안으로 간주합니다.
  3. 프로그램의 다른 곳에서 add에 대한 외부 (비 - 인라인) 정의를 제공하십시오. 두 정의는 동등해야합니다!
  4. -std = gnu89를 Clang 옵션 세트에 추가하여 GNU C89 언어로 컴파일하십시오.이 옵션은 프로그램 원본을 변경할 수 없거나 프로그램이 변경할 수없는 추가 C89 특정 동작에 의존하는 경우에만 권장됩니다.

이 모든 것은 C 코드에만 적용됩니다. C++에서의 인라인의 의미는 GNU89 또는 C99에서의 의미와 매우 다릅니다.

+0

OP는 clang이 아닌 gcc로 컴파일됩니다. – frasnian

+0

설명 해 주셔서 감사합니다 :). C99 이상에서는 인라인을 사용할 수 없다는 점에 유의하지 않았습니다. "인라인 추가"기능과 충돌 할 수있는 "추가"기능을 추가하지 않고 외부 비 인라인을 어떻게 제공합니까? –